Может войдёшь?
Черновики Написать статью Профиль

Сессии

перевод документация 5.х

  1. 1. Введение
  2. 2. Настройка
    1. 2.1. Требования для драйверов
    2. 2.2. Другие рекомендации для сессий
  3. 3. Использование сессий
  4. 4. Одноразовые данные
  5. 5. Добавление своих драйверов сессий
Этот перевод актуален для англоязычной документации на (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

HTTP-приложения не имеют состояний. Сессии — способ сохранения информации о пользователе между отдельными запросами. Laravel поставляется со множеством различных механизмов сессий, доступных через единое API. Из коробки поддерживаются такие системы, как Memcached, Redis и СУБД.

Настройка

Настройки сессии содержатся в файле config/session.php. Обязательно просмотрите параметры, доступные вам — они хорошо документированы. По умолчанию Laravel использует драйвер сессий file, который подходит для большинства приложений. Для увеличения производительности сессий в продакшне вы можете использовать драйверы memcached или redis.

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

  • file — данные хранятся в storage/framework/sessions.
  • cookie — данные хранятся в виде зашифрованных cookie.
  • database — хранение данных в БД, используемой приложением.
  • memcached / redis — для хранения используются эти быстрые кэширующие хранилища.
  • array — данные содержатся в виде простых массивов PHP и не будут сохраняться между запросами.

Внимание: драйвер array обычно используется для юнит-тестов, так как он на самом деле не сохраняет данные для последующих запросов.

Требования для драйверов

Database

При использовании драйвера сессий database вам необходимо создать таблицу для хранения данных сессии. Ниже — пример такого объявления с помощью конструктора таблиц:

PHP
Schema::create('sessions', function ($table) {
  
$table->string('id')->unique();
  
$table->text('payload');
  
$table->integer('last_activity');
});

Для создания этой миграции вы можете использовать Artisan-команду shsession:table:

shphp artisan session:table

composer dump-autoload

php artisan migrate

Redis

Чтобы использовать сессии Redis в Laravel, необходимо установить пакет predis/predis (~1.0) с помощью Composer.

Другие рекомендации для сессий

Laravel использует внутренний ключ сессий flash, поэтому нельзя добавлять элемент с таким именем в сессию.

Если вы хотите шифровать все хранимые данные сессий, установите значение параметра encrypt равное true.

+ 5.0

добавлено в 5.0 ()

Внимание: При использовании драйвера сессий cookie, никогда не удаляйте посредника EncryptCookie из вашего HTTP-ядра. Если вы это сделаете, ваше приложение станет уязвимым для удалённого внедрения кода.

Использование сессий

Обращение к сессии

Сначала давайте обратимся к сессии. Мы можем обратиться к экземпляру сессии через HTTP-запрос, который может быть указан в качестве зависимости в методе контроллера. Учтите, зависимости метода контроллера внедряются при помощи сервис-контейнера Laravel:

PHP
<?php

namespace App\Http\Controllers;

use 
Illuminate\Http\Request;
use 
App\Http\Controllers\Controller;

class 
UserController extends Controller
{
  
/**
   * Показать профиль данного пользователя.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function showProfile(Request $request$id)
  {
    
$value $request->session()->get('key');

    
//
  
}
}

При получении значения из сессии, вы можете передать значение по умолчанию вторым аргументом метода PHPget(). Это значение будет возвращено, если указанного ключа нет в сессии. Если вы передадите в метод замыкание в качестве значения по умолчанию, то будет выполняться это замыкание и возвращаться его результат:

PHP
$value $request->session()->get('key''default');

$value $request->session()->get('key', function() {
  return 
'default';
});

Если вы хотите получить все данные из сессии, используйте метод PHPall():

PHP
$data $request->session()->all();

Также вы можете использовать глобальную PHP-функцию PHPsession() для извлечения и помещения данных в сессию:

PHP
Route::get('home', function () {
  
// Получить кусок данных из сессии...
  
$value session('key');

  
// Сохранить кусок данных в сессию...
  
session(['key' => 'value']);
});

Определение наличия элемента в сессии

Метод PHPhas() можно использовать для проверки существования элемента в сессии. Этот метод вернёт true, если элемент существует:

PHP
if ($request->session()->has('users')) {
  
//
}

Сохранение данных в сессии

Когда вы получили доступ к экземпляру сессии, вы можете вызвать различные функции для взаимодействия с её данными. Например, метод PHPput() помещает новый кусок данных в сессию:

PHP
$request->session()->put('key''value');

Запись данных в массивы сессии

Метод PHPpush() служит для записи нового значения в элемент сессии, который является массивом. Например, если ключ user.teams содержит массив с именами команд, вы можете записать новое значение в массив вот так:

PHP
$request->session()->push('user.teams''developers');

Чтение и удаление элемента

Метод PHPpull() прочитает и удалит элемент из сессии:

PHP
$value $request->session()->pull('key''default');

Удаление элементов из сессии

Метод PHPforget() удалит куски данных из сессии. Для удаления из сессии всех данных используйте метод PHPflush():

PHP
$request->session()->forget('key');

$request->session()->flush();

Обновление ID сессии

Для обновления ID сессии используйте метод PHPregenerate():

PHP
$request->session()->regenerate();
+ 5.0

добавлено в 5.0 ()

С сессиями можно работать несколькими способами: с помощью метода PHPsession() HTTP-запросов, с помощью фасада Session, или с помощью функции PHPsession(). При вызове функции PHPsession() без аргументов она возвратит весь объект сессии. Например:

PHP
session()->regenerate();

Сохранение переменной в сессии

PHP
Session::put('key''value');

session(['key' => 'value']);

Добавление элемента к переменной-массиву

PHP
Session::push('user.teams''developers');

Чтение переменной сессии

PHP
$value Session::get('key');

$value session('key');

Чтение переменной или возврат значения по умолчанию

PHP
$value Session::get('key''default');

$value Session::get('key', function() { return 'default'; });

Прочитать переменную и забыть её

PHP
$value Session::pull('key''default');

Получение всех переменных сессии

PHP
$data Session::all();

Проверка существования переменой

PHP
if (Session::has('users'))
{
  
//
}

Удаление переменной из сессии

PHP
Session::forget('key');

Удаление всех переменных

PHP
Session::flush();

Присвоение сессии нового идентификатора

PHP
Session::regenerate();

Одноразовые данные

Иногда вам нужно сохранить переменную только для следующего запроса. Вы можете сделать это методом PHPflash() (flash англ. — вспышка — прим. пер.). Сохранённые этим методом данные будут доступны только во время следующего HTTP-запроса, а затем будут удалены. В основном такие данные полезны для кратковременных сообщений о состоянии:

PHP
$request->session()->flash('status''Задание выполнено успешно!');
+ 5.0

добавлено в 5.0 ()

PHP
Session::flash('key''value');

Для сохранения одноразовых данных в течение большего числа запросов используйте метод PHPreflash(), который оставит все эти данные для следующего запроса. А если вам надо хранить только определённые данные, то используйте метод PHPkeep():

PHP
$request->session()->reflash();

$request->session()->keep(['username''email']);
+ 5.0

добавлено в 5.0 ()

PHP
Session::reflash();

Session::keep(['username''email']);

Добавление своих драйверов сессий

Для добавления дополнительных драйверов для работы с сессиями в Laravel используйте метод PHPextend() фасада Session. Вы можете вызвать метод PHPextend() из метода PHPboot() сервис-провайдера:

PHP
<?php

namespace App\Providers;

use 
Session;
use 
App\Extensions\MongoSessionStore;
use 
Illuminate\Support\ServiceProvider;

class 
SessionServiceProvider extends ServiceProvider
{
  
/**
   * Выполнение после-регистрационной загрузки сервисов.
   *
   * @return void
   */
  
public function boot()
  {
    
Session::extend('mongo', function($app) {
      
// Возврат реализации SessionHandlerInterface...
      
return new MongoSessionStore;
    });
  }

  
/**
   * Регистрация привязок в контейнере.
   *
   * @return void
   */
  
public function register()
  {
    
//
  
}
}

Обратите внимание, ваш драйвер сессий должен реализовывать SessionHandlerInterface. Этот интерфейс содержит всего несколько простых методов, которые надо реализовать. Заглушка реализации MongoDB выглядит приблизительно так:

PHP
<?php

namespace App\Extensions;

class 
MongoHandler implements SessionHandlerInterface
{
  public function 
open($savePath$sessionName) {}
  public function 
close() {}
  public function 
read($sessionId) {}
  public function 
write($sessionId$data) {}
  public function 
destroy($sessionId) {}
  public function 
gc($lifetime) {}
}

Поскольку эти методы не так очевидны, как методы StoreInterface кэша, давайте коротко рассмотрим каждый из них:

  • Метод PHPopen() обычно используется в системе хранения файл-сессий. Поскольку Laravel поставляется с драйвером сессий file, вам почти никогда не потребуется делать что-либо в этом методе. Вы можете оставить его пустым как заглушку. То, что PHP требует реализовать данный метод, — это пример плохого проектирования интерфейса (обсудим это позже).
  • Методом PHPclose() зачастую можно пренебречь, как и методом PHPopen(). Для большинства драйверов он не нужен.
  • Метод PHPread() должен вернуть данные сессии по PHP$sessionId в виде строки. Не нужно выполнять сериализацию или другое преобразование при получении или сохранении данных сессии в ваш драйвер, поскольку Laravel выполнит сериализацию за вас.
  • Метод PHPwrite() должен записать указанную строку PHP$data в соответствии с PHP$sessionId в какое-либо постоянное хранилище, такое как MongoDB, Dynamo и т.п.
  • Метод PHPdestroy() должен удалить из постоянного хранилища данные, соответствующие PHP$sessionId.
  • Метод PHPgc() должен удалить все данные сессий, которые старше заданного PHP$lifetime (который является отметкой времени UNIX). Для самоочищающихся систем, таких как Memcached и Redis, этот метод можно оставить пустым.

Когда драйвер сессий зарегистрирован, вы можете использовать драйвер mongo в своём файле настроек config/session.php.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.