2017-01-24 17 views
1

В настоящее время я пытаюсь реализовать способ записи данных сеанса аналогично тому, как Laravel занимается данными флэш-памяти. Я знаю, что Laravel переопределяет собственные методы сеанса, вызываемые такими функциями, как session_start.Как Laravel отключил данные флеш-сессии?

Они, кажется, делают это с Http foundation пакета Symfony путем создания пользовательских методов для open, read, write и т.д. для сессии. Это делается с помощью session_set_save_handler:

http://php.net/manual/en/function.session-set-save-handler.php

С помощью этой функции можно реализовать открытую логику при запуске сеанса или сеанс получает запись. Но пока я не могу найти прямую логику в кодовой базе Laravel, где данные флэш-памяти не установлены.

Было бы целесообразно отключить данные вспышки прямо перед функциональностью сессии write. Таким образом, вы можете отключить его для будущих запросов и будете уверены, что это произойдет только при завершении вашего кода.

Может ли кто-нибудь сказать мне, как Laravel занимается сессионными флэш-сообщениями?

ответ

2

В классе Illuminate\Session\Store вы можете найти метод save, который вызывается при сохранении сеансов. Ака session_set_save_handler по существу.

https://github.com/laravel/framework/blob/7acc98e112cce4e04f30c7ee4fc0a53dbc5c425b/src/Illuminate/Session/Store.php#L261

На этой линии метод $this->ageFlashData(); называется.

Способ содержит следующий код

$this->forget($this->get('_flash.old', [])); 
    $this->put('_flash.old', $this->get('_flash.new', [])); 
    $this->put('_flash.new', []); 

Так на странице вызова все флэш-данные хранятся в _flash.new. Когда сеансы сохранены, все данные в _flash.old будут удалены, и все, что хранится в _flash.new, будет перенесено на _flash.old. _flash.new готов хранить новые данные для следующей странице вызова

Если вы хотите сохранить флэш-сообщения, например на AJAX вызова вы можете использовать метод reflash() в магазине сеанса, который перемещает все в _flash.old обратно в _flash.new

+1

Как насчет того, когда выполняются запросы или переадресации ajax? Будет ли Laravel также перемещать данные вспышки в старые или есть чеки для этого? Я думаю, вы можете получить нежелательное поведение, если что-то вроде ajax-запроса или перенаправления приводит к тому, что данные флэш-памяти будут отменены. –

+1

При вызове ajax данные флэш-памяти перемещаются в _flash.old. вы можете увидеть это в промежуточном программном обеспечении StartSession. Если вы хотите сохранить данные флэш-памяти для следующего запроса, вы можете использовать метод 'reflash' –