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

Сессии

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

  1. 1. Введение
    1. 1.1. Настройка
    2. 1.2. Требования для драйверов
    3. 1.3. Другие рекомендации для сессий
  2. 2. Использование сессий
    1. 2.1. Получение данных
    2. 2.2. Сохранение данных
  3. 3. Одноразовые данные
    1. 3.1. Удаление данных
    2. 3.2. Обновление ID сессии
  4. 4. Добавление своих драйверов сессий
Этот перевод актуален для англоязычной документации на (ветка 5.3) , (ветка 5.2) , (ветка 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->integer('user_id')->nullable();
  
$table->string('ip_address'45)->nullable();
  
$table->text('user_agent')->nullable();
  
$table->text('payload');
  
$table->integer('last_activity');
});

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

shphp artisan session:table

php artisan migrate

Redis

Чтобы использовать сессии Redis в Laravel, необходимо установить пакет predis/predis (~1.0) с помощью Composer. Вы можете настроить подключения Redis в файле настроек database. А в файле session в параметре connection можно указать конкретное подключение Redis для сессии.

+ 5.2 5.1 5.0

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

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

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

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

+ 5.0

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

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

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

Получение данных

В Laravel есть два основных способа работы с данными сессии: с помощью глобального вспомогательного метода PHPsession() и через экземпляр Request. Сначала давайте обратимся к сессии через экземпляр Request, который может быть указан в качестве зависимости в методе контроллера. Учтите, зависимости метода контроллера автоматически внедряются при помощи сервис-контейнера 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 show(Request $request$id)
  {
    
$value $request->session()->get('key');

    
//
  
}
}

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

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

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

Глобальный вспомогательный метод PHPsession()

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

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

  
// Указать значение по умолчанию...
  
$value session('key''default');

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

Есть небольшое практическое отличие между использованием сессий через экземпляр HTTP-запроса и использованием глобального вспомогательного метода PHPsession(). Оба способа тестируются методом PHPassertSessionHas(), доступным во всех ваших тест-кейсах.

Получение всех данных сессии

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

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

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

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

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

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

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

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

Для сохранения данных в сессии обычно используются метод PHPput() или вспомогательный метод PHPsession():

PHP
// Через экземпляр запроса...
$request->session()->put('key''value');

// Через глобальный вспомогательный метод...
session(['key' => 'value']);

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

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

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

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

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

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

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

Иногда вам нужно сохранить переменную в сессии только для следующего запроса. Вы можете сделать это методом 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']);

Удаление данных

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

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

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

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

Обновление ID сессии часто используется для защиты приложения от злоумышленников, применяющих атаку фиксации сессии.

Laravel автоматически обновляет ID сессии во время аутентификации, если вы используете встроенный LoginController; но если вы хотите обновлять 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();

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

Реализация драйвера

Ваш драйвер сессий должен реализовывать 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) {}
}

В Laravel нет стандартного каталога для ваших расширений. Вы можете разместить их где угодно. В этом примере мы создали каталог Extensions для хранения в нём MongoHandler.

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

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

Регистрация драйвера

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

PHP
<?php

namespace App\Providers;

use 
App\Extensions\MongoSessionStore;
use 
Illuminate\Support\Facades\Session;
//для версии 5.2 и ранее:
//use Session;
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()
  {
    
//
  
}
}

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

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

Разметка: ? ?

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