2015-03-20 4 views
0

Я расширяю провайдера сеанса, чтобы сохранить некоторые требуемые данные. Я начал редактировать AppServiceProvider's boot method:Расширенное сеанс в L5 не сохраняется между запросами

\Session::extend('desk', function($app) 
{ 
    return new Desk(); 
}); 

Desk класс выглядит следующим образом:

namespace App\Services; 


use Illuminate\Session\ExistenceAwareInterface; 

class Desk implements \SessionHandlerInterface, ExistenceAwareInterface{ 

    /** 
    * The existence state of the session. 

    * @var bool 
    */ 
    protected $exists; 

    public function close() 
    { 
     return true; 
    } 

    public function destroy($session_id) 
    { 
     $session = $em->find('Session', $session_id); 
     $em->remove($session); 
     $em->flush(); 

     return true; 
    } 

    public function gc($maxlifetime) 
    { 
     // TODO: Implement gc() method. 
    } 

    public function open($save_path, $session_id) 
    { 
     return true; 
    } 

    public function read($session_id) 
    { 
     $session = $em->find('Session', $session_id); 

     if ($sesion !== null){ 
      $this->exists = true; 
      return $session->getPayload(); 
     } 
    } 

    public function write($session_id, $session_data) 
    { 
     $session = $em->find('Session', $session_id); 

     if ($session === null){ 
      $session = new Session($session_id, $session_data); 
      $em->persist($session); 
     } 
     else{ 
      $session->setPayload($session_data); 
     } 

     $em->flush(); 

     $this->exists = true; 
    } 


    public function setExists($value) 
    { 
     $this->exists = $value; 

     return $this; 
    } 
} 

После финиша реализации, я изменил сеанс конфигурации для этого:

return [ 
    'driver' => 'desk', 
    'lifetime' => 120, 
    'expire_on_close' => false, 
    'encrypt' => false, 
    'files' => storage_path().'/framework/sessions', 
    'connection' => null, 
    'table' => 'sessions', 
    'lottery' => [2, 100], 
    'cookie' => 'lote_session', 
    'path' => '/', 
    'domain' => null, 
    'secure' => false, 
]; 

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

Дополнительная информация: если я верну драйвер сессии в «файл», все будет хорошо.

ответ

0

Ну, для других, которые нуждаются/хотят расширить поставщика сеанса, как и я, обратите внимание на структуру таблицы сеанса. Моя ошибка заключалась в том, что payload колонна была установлена ​​как:

payload varchar(255) not null 

Из данных сериализации Laravel значение полезной нагрузки может быть более чем 255 символов длиной, следовательно, он будет нарушать данные и сделать его несовместимым. Вы можете рассмотреть:

payload text not null 
Смежные вопросы