I'm looking for solution for override.
Magento\Framework\Session\SessionManager
I use the usually way (preference in di.xml), but no hope.
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Framework\Session\SessionManager" type="Gssi\FixEmptyCart\Session\SessionManager" />
</config>
SessionManager.php
<?php
/**
* Magento session manager
*
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Gssi\FixEmptyCart\Session;
/**
* Session Manager
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class SessionManager extends \Magento\Framework\Session\SessionManager
{
public function regenerateId()
{
var_dump('1234'); exit;
if (headers_sent()) {
return $this;
}
if ($this->isSessionExists()) {
$oldSessionId = session_id();
session_regenerate_id(); //regen the session
$new_session_id = session_id();
$_SESSION['new_session_id'] = $new_session_id;
// Set destroy timestamp
$_SESSION['destroyed'] = time();
// Write and close current session;
session_commit();
$oldSession = $_SESSION; //called after destroy - see destroy!
// Start session with new session ID
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);
$_SESSION = $oldSession;
// New session does not need them
unset($_SESSION['destroyed']);
unset($_SESSION['new_session_id']);
} else {
session_start();
}
$this->storage->init(isset($_SESSION) ? $_SESSION : []);
if ($this->sessionConfig->getUseCookies()) {
$this->clearSubDomainSessionCookie();
}
return $this;
}
public function start()
{
if (!$this->isSessionExists()) {
\Magento\Framework\Profiler::start('session_start');
try {
$this->appState->getAreaCode();
} catch (\Magento\Framework\Exception\LocalizedException $e) {
throw new \Magento\Framework\Exception\SessionException(
new \Magento\Framework\Phrase(
'Area code not set: Area code must be set before starting a session.'
),
$e
);
}
// Need to apply the config options so they can be ready by session_start
$this->initIniOptions();
$this->registerSaveHandler();
if (isset($_SESSION['new_session_id'])) {
// Not fully expired yet. Could be lost cookie by unstable network.
session_commit();
session_id($_SESSION['new_session_id']);
}
// potential custom logic for session id (ex. switching between hosts)
$this->setSessionId($this->sidResolver->getSid($this));
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
$this->destroy(['clear_storage' => true]);
}
}
$this->validator->validate($this);
register_shutdown_function([$this, 'writeClose']);
$this->_addHost();
\Magento\Framework\Profiler::stop('session_start');
}
$this->storage->init(isset($_SESSION) ? $_SESSION : []);
return $this;
}
}
?>
I've also clear cache, enable this module, setup upgrade ..
Please help, thanks 🙂
Best Answer
Because many child classes extend Magento\Framework\Session\SessionManager
Magento used subclass of Magento\Framework\Session\SessionManager instead of Magento\Framework\Session\SessionManager such as
And objectManager Create Subclass not Magento\Framework\Session\SessionManager, You can try to override Magento\Customer\Model\Session.
in that bug, you should apply the path instead of trying to fix.
Link reference path file: https://github.com/magento/magento2/issues/12362#issuecomment-416065934