сессия zend framework 3 не работает

Я пытаюсь настроить веб-приложение zend framework 3 MVC для использования хранилища сеансов. Следуя информации с этого сайта -

https://olegkrivtsov.github.io/using-zend-framework-3-book/html/en/Working_with_Sessions/PHP_Sessions.html

Все работает хорошо. Я получаю переменную сеанса в своем контроллере и могу сохранять данные в контейнере сеанса. Проблема в том, что данные, которые я сохраняю в контейнере, НЕТ при последующих вызовах. Я сохраняю критерии поиска с одной страницы и делаю перенаправление на вторую страницу, чтобы выполнить поиск и вернуть результаты. Когда я захожу на вторую страницу, данных сеанса нет.

В config \ global.php у меня есть -

return [
    'session_config' => [
        // Cookie expires in 1 hour
        'cookie_lifetime' => 60*60*1,
        // Stored on server for 30 days
        'gc_maxlifetime' => 60*60*24*30,
        ],
    'session_manager' => [
        'validators' => [
            RemoteAddr::class,
            HttpUserAgent::class,
            ],
        ],
    'session_storage' => [
        'type' => SessionArrayStorage::class,
    ],
];

В application \ module.php я изменил onBoostrap

public function onBootstrap(MvcEvent $event)
{
    $application = $event->getApplication();
    $svcMgr = $application->getServiceManager();

    //  Instantiate the session manager and
    //  make it the default one
    //
    $sessionManager = $svcMgr->get(SessionManager::class);
 }

Я создал IndexControllerFactory

class IndexControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container,
                             $requestedName, array $options = null)
    {
        // Get access to session data
        //
        $sessionContainer = $container->get('Books\Session');
        return new IndexController($sessionContainer);
    }
}

Изменен мой IndexController, чтобы добавить метод конструктора

class IndexController extends AbstractActionController
{
    private $session;

    public function __construct(Container $session)
    {
        $this->session = $session;
    }

В application \ module.config.php у меня есть это

'controllers' => [
    'factories' => [
        Controller\IndexController::class => Controller\Factory\IndexControllerFactory::class,
    ],
],
'session_containers' => [
    'Books\Session'
],

person ScottTx    schedule 08.12.2016    source источник


Ответы (1)


Чтобы сохранить что-то в сеансе, вы можете создать контейнер следующим образом:

// Create a session container
$container = new Container('Books\Session');
$container->key = $value;

Чтобы получить что-то из контейнера сеанса позже, вам нужно создать новый контейнер с тем же именем:

// Retrieve from session container
$container = new Container('Books\Session');
$value = $container->key;

Насколько мне известно, это работает одинаково как для ZF2, так и для ZF3, и его можно найти в других сообщениях на StackOverflow или, например, это сообщение в блоге с заголовком < strong> Использование сеансов в Zend Framework 2.

Если вы создаете новый Container для хранения или разрешения данных из сеанса, он автоматически будет использовать диспетчер сеанса по умолчанию, если вы не передадите его самостоятельно.

Вы можете увидеть, что здесь, в методе AbstractContainer::__construct в строке 77 . Если $manager, переданный конструктору, - null, он получит диспетчер сеансов по умолчанию внутри setManager метод.

Таким образом, чтобы использовать сеансы, вам не нужно много настраивать вручную.

Если это не решит вашу проблему, оставьте комментарий.

person Wilt    schedule 21.12.2016