Session
- Conditions préalables du pilote
- Base de données "Flash data" ister driver
file
- 将 Session 存储在storage/framework/sessions
中。cookie
- Sessions 被存储在安全加密的 cookie 中。database
- Sessions 被存储在关系型数据库中。memcached
/redis
- Sessions 被存储在基于高速缓存的存储系统中。array
- Sessions 存储在 PHP 数组中,但不会被持久化。
Mécanisme de session HTTP
Introduction
Parce que piloté par HTTP les applications sont sans état, les sessions fournissent un moyen de stocker des informations sur l'utilisateur sur plusieurs requêtes et Laravel gère divers pilotes backend natifs via la même API lisible. Prend en charge les bases de données populaires telles que Memcached, Redis et autres.
Configuration
Le fichier de configuration de la session est stocké dans le fichier config/session.php
. Assurez-vous de revoir les options qui s’offrent à vous dans ce fichier. Par défaut, Laravel configure le pilote de session pour la plupart des applications comme file
. Dans un environnement de production, vous pouvez envisager d'utiliser le pilote memcached
ou redis
pour améliorer encore les performances de la session. config/session.php
文件中。请务必查看此文件中对于你而言可用的选项。默认情况下,Laravel 为绝大多数应用程序配置的 Session 驱动为 file
。在生产环境中,你可以考虑使用 memcached
或 redis
驱动,让 Session 的性能更加出色。
Session driver
的配置预设了每个请求存储 Session 数据的位置。Laravel 自带了几个不错而且开箱即用的驱动:
{tip} 数组驱动一般用于 测试 并且防止存储在 Session 中的数据被持久化。
驱动程序先决条件
数据库
使用 database
作为 Session 驱动时,你需要创建一张包含 Session 各项数据的表。以下是使用 Schema
建表的例子:
Schema::create('sessions', function ($table) { $table->string('id')->unique(); $table->unsignedInteger('user_id')->nullable(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->text('payload'); $table->integer('last_activity'); });
你可以使用 Artisan 命令 session:table
pilote
de session prédéfinit l'emplacement où les données de session sont stockées pour chaque requête. Laravel est livré avec plusieurs bons pilotes prêts à l'emploi : file
- Store Session in storage/framework/sessions< / code> dans. 🎜🎜cookie
- Les sessions sont stockées dans des cookies sécurisés et cryptés. 🎜🎜base de données
- Les sessions sont stockées dans une base de données relationnelle. 🎜🎜memcached
/ redis
- Les sessions sont stockées dans un système de stockage basé sur le cache. 🎜🎜array
- Les sessions sont stockées dans des tableaux PHP mais ne sont pas conservées. 🎜🎜🎜🎜{tip} Les pilotes de tableau sont généralement utilisés pour les tests et pour empêcher la persistance des données stockées dans la session. 🎜
🎜🎜🎜🎜🎜Prérequis du pilote🎜🎜Base de données
🎜Lorsque vous utilisez base de données
comme pilote de session, vous devez créer une table contenant diverses données de session. Voici un exemple d'utilisation de Schema
pour créer une table : 🎜php artisan session:table
php artisan migrate
🎜 Vous pouvez utiliser la commande Artisan session:table
pour générer cette migration : 🎜<?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');
//
}
}
🎜🎜Redis
Avant d'utiliser Redis comme pilote de session dans Laravel, vous devez installer le package d'extension predis/predis
(~1.0) via Composer. Configurez ensuite les informations de connexion Redis dans le fichier de configuration database
. Dans le fichier de configuration session
, l'option connection
peut être utilisée pour spécifier quelle connexion Redis la session utilise. predis/predis
扩展包 (~1.0)。然后在 database
配置文件中配置 Redis 连接信息。在 session
配置文件中,connection
选项可用于指定 Session 使用哪个 Redis 连接。
使用 Session
获取数据
Laravel 中处理 Session 数据有两种主要方法:全局辅助函数 session
和通过一个 Request
实例。首先,我们来看看通过控制器方法类型提示一个 Request
实例来访问 session。控制器方法依赖项会通过 Laravel 服务容器 实现自动注入:
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function () {
return 'default';
});
当你从 Session 获取值时,你还可以传递一个默认值作为 get
方法的第二个参数。如果 Session 中不存在指定的键,便会返回这个默认值。若传递一个闭包作为 get
方法的默认值,并且所请求的键并不存在时,get
方法将执行闭包并返回其结果:
Route::get('home', function () {
// 获取 session 中的一条数据...
$value = session('key');
// 指定一个默认值...
$value = session('key', 'default');
// 在 Session 中存储一条数据...
session(['key' => 'value']);
});
全局辅助函数 Session
你也可以使用全局的 PHP 辅助函数 session
来获取和存储 Session 数据。 使用单个字符串类型的值作为参数调用辅助函数 session
时,它会返回该字该符串对应的 Session 键的值。当使用一个键值对数组作为参数调用辅助函数 session
时,传入的键值将会存储在 Session 中:
$data = $request->session()->all();
{tip} 通过 HTTP 请求实例操作 Session 与使用全局辅助函数 session
两者之间并没有实质上的区别。这两种方法都可以通过所有测试用例中可用的 assertSessionHas
方法进行 测试 。
获取所有的 Session 数据
如果你想要获取所有的 Session 数据,可以使用 all
方法:
if ($request->session()->has('users')) {
//
}
判断 Session 中是否存在某个值
要确定 Session 中是否存在某个值,可以使用 has
方法。如果该值存在且不为 null
,那么 has
方法会返回 true
:
if ($request->session()->exists('users')) {
//
}
要确定 Session 中是否存在某个值,即使其值为 null
,也可以使用 exists
方法。如果值存在,则 exists
方法返回 true
Utilisation de la session
🎜Obtenir des données
🎜Il existe deux manières principales de traiter les données de session dans Laravel : la fonction d'assistance globale session< /code> et transmettez une instance Request
. Tout d'abord, regardons l'accès à la session via un indice de type de méthode de contrôleur pour une instance Request
. Les dépendances des méthodes du contrôleur sont automatiquement injectées via le conteneur de service Laravel : 🎜// 通过请求实例...
$request->session()->put('key', 'value');
// 通过全局辅助函数...
session(['key' => 'value']);
🎜 Lorsque vous obtenez une valeur de la session, vous pouvez également transmettre une valeur par défaut comme deuxième paramètre de la méthode get
. Si la clé spécifiée n'existe pas dans la session, cette valeur par défaut sera renvoyée. Si une fermeture est passée comme valeur par défaut à la méthode get
et que la clé demandée n'existe pas, la méthode get
exécutera la fermeture et retournera son résultat : 🎜$request->session()->push('user.teams', 'developers');
< div name="f44185" data-unique="f44185">🎜🎜Fonction auxiliaire globale Session🎜🎜Vous pouvez également utiliser la fonction auxiliaire globale PHP session
pour obtenir et stocker les données de session. Lorsque la fonction d'assistance session
est appelée avec une seule valeur de chaîne comme argument, elle renvoie la valeur de la clé de session correspondant à cette chaîne. Lors de l'appel de la fonction auxiliaire session
avec un tableau de paires clé-valeur comme paramètres, les valeurs clés entrantes seront stockées dans la session : 🎜$value = $request->session()->pull('key', 'default');
🎜{tip} Manipulez la session et Utilisation de la fonction d'assistance globale session
Il n'y a pas de réelle différence entre les deux. Les deux méthodes peuvent être testées via la méthode assertSessionHas
disponible dans tous les cas de test. 🎜
🎜🎜Obtenir toutes les données de session🎜🎜Si vous souhaitez obtenir toutes les données de session, vous pouvez utiliser la méthode all
:🎜$request->session()->flash('status', 'Task was successful!');
🎜🎜Déterminer si une certaine valeur existe dans la session🎜🎜Pour déterminer si une certaine valeur existe dans la session, vous pouvez utiliser has< /code> méthode. Si la valeur existe et n'est pas null
, alors la méthode has
retournera true
: 🎜$request->session()->reflash();
$request->session()->keep(['username', 'email']);
🎜Pour déterminer si une valeur existe dans la session , La méthode exists
peut être utilisée même si sa valeur est null
. La méthode exists
renvoie true
si la valeur existe : 🎜$request->session()->forget('key');
$request->session()->flush();
🎜🎜🎜🎜🎜🎜Stockage des données
Pour stocker des données dans Session, vous pouvez utiliser la méthode put
, ou utiliser la fonction auxiliaire session
. put
方法,或者使用辅助函数 session
。
$request->session()->regenerate();
在 Session 数组中保存数据
push
方法可以将一个新的值添加到 Session 数组内。例如,假设 user.teams
这个键是包括团队名称的数组,你可以这样将一个新的值加入到数组中:
<?php
namespace App\Extensions;
class MongoSessionHandler 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) {}
}
检索 & 删除一条数据
pull
方法可以只使用一条语句就从 Session 中检索并删除一条语句:
<?php
namespace App\Providers;
use App\Extensions\MongoSessionHandler;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;
class SessionServiceProvider extends ServiceProvider{
/**
* 执行服务的注册后启动
*
* @return void
*/
public function boot()
{
Session::extend('mongo', function ($app) {
// 返回实现 SessionHandlerInterface 的对象
return new MongoSessionHandler;
});
}
/**
* 在容器中注册绑定关系
*
* @return void
*/
public function register()
{
//
}
}
闪存数据
有时候你可能想在 Session 中保存数据用于下一次请求,这时你可以使用 flash
方法。使用这个方法保存在 Session 中的数据,只会保留到下一个 HTTP 请求到来之前,然后就会被删除。闪存数据主要用于短期的状态消息:
rrreee如果你需要在更多的请求中使用到该一次性数据,你可以使用 reflash
方法,该方法会将所有一次性请求保留到下一次请求。如果你想保存一次性数据,你可以用 keep
方法:
rrreee删除数据
forget
方法会从 Session 中删除指定数据,如果想从 Session 中删除所有数据,可以使用 flush
方法:
rrreee重新生成 Session ID
重新生成 session ID 通常是为了防止恶意用户利用 session fixation 对你的应用进行攻击。
如果你使用了内置函数 LoginController
,Laravel 会自动重新生成身份认证中的 Session ID。否则,你需要手动使用 regenerate
rrreee
Enregistrer les données dans le tableau Session
La méthode push
peut ajouter une nouvelle valeur à la session dans le tableau . Par exemple, en supposant que la clé user.teams
est un tableau contenant les noms d'équipes, vous pouvez ajouter une nouvelle valeur au tableau comme ceci : rrreeeRécupérer et supprimer une donnée
La méthode pull
peut récupérer et supprimer une instruction de la session en utilisant une seule instruction : rrreeeParfois, vous souhaiterez peut-être enregistrer des données en session pour la prochaine requête, vous pouvez alors utiliser flash< /code> méthode. Les données enregistrées dans la session à l'aide de cette méthode ne seront conservées que jusqu'à l'arrivée de la prochaine requête HTTP, puis elles seront supprimées. Les données Flash sont principalement utilisées pour les messages d'état à court terme : rrreeeSi vous devez utiliser ces données uniques dans plusieurs requêtes, vous pouvez utiliser la méthode reflash
, qui enregistrera toutes les données une seule fois. demandes Réservées jusqu'à la prochaine demande. Si vous souhaitez enregistrer des données uniques, vous pouvez utiliser la méthode keep
: 🎜rrreee🎜🎜🎜🎜🎜Supprimer les données🎜🎜La méthode forget
supprimera les données spécifiées de la session. Si vous souhaitez supprimer toutes les données de la session, vous pouvez utiliser le flush méthode : 🎜rrreee🎜🎜🎜🎜🎜Régénération de l'ID de session🎜🎜La régénération de l'ID de session est généralement pour empêcher les utilisateurs malveillants d'exploiter la fixation de session. Attaquez votre application. 🎜🎜Si vous utilisez la fonction intégrée LoginController
, Laravel régénérera automatiquement l'ID de session lors de l'authentification. Sinon, vous devez régénérer manuellement l'ID de session à l'aide de la méthode regenerate
. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Ajouter un pilote de session personnalisé🎜🎜🎜🎜🎜🎜🎜Implémentation du pilote
Votre pilote de session personnalisé doit implémenter l'interface SessionHandlerInterface
. Cette interface contient quelques méthodes simples que nous devons implémenter. Ce qui suit est un exemple du processus général d'implémentation de MongoDB : SessionHandlerInterface
接口。这个接口包含了一些我们需要实现的简单方法。下面是 MongoDB 实现的大概流程示例:
rrreee{tip} Laravel 默认没有附带一个用于包扩展的目录,你可以把它放在你喜欢的目录内。在上面这个例子中,我们创建了一个 Extensions
目录用于存放 MongoSessionHandler
。
由于以上方法并不是很容易理解,所以我们接下来快速过一遍每一个方法:
open
方法通常用于基于文件的 Session 存储系统。因为 Laravel 已经附带了一个 file
Session 驱动。所以你不需要在该方法中放置任何代码。PHP 要求必须要有这个方法的实现(这只是一个糟糕的接口设计),你只需要把这个方法置空。close
方法跟 open
方法相似,通常也可以被忽略。对大多数的驱动而言,此方法不是必须的。read
方法应当返回与给定的 $sessionId
相匹配的 Session 数据的字符串格式。在你的自定义的驱动中获取或存储 Session 数据时,不需要进行任何序列化或者其他编码,因为 Laravel 会自动为你执行序列化。write
方法将与 $sessionId
关联的给定的 $data
字符串写入到一些持久化存储系统,如 MongoDB、 Dynamo 等。再次重申,你不需要进行任何序列化或其他编码,因为 Laravel 会自动为你处理这些事情。destroy
方法将会从持久化存储中与删除与 $sessionId
相关的数据。gc
方法能销毁给定的 $lifetime
(UNIX 的时间戳)之前的所有数据。对本身拥有过期机制的系统如 Memcached 和 Redis 而言,该方法可以置空。
注册驱动
当实现驱动后,需要在框架中注册它。在 Laravel
后端添加额外的驱动,需要使用 Session
facade 的 extend
方法。你应该在 服务提供者 中的 boot
方法中调用 extend
方法。你可以在已有的 AppServiceProvider
或者另外创建一个服务提供者执行此操作:
rrreee驱动完成注册时,你可以在使用在配置文件 config/session.php
中使用 mongo
rrreee
{tip} Laravel n'est pas livré par défaut avec un répertoire pour les extensions de package, vous pouvez le mettre dans le répertoire de votre choix. Dans l'exemple ci-dessus, nous avons créé un répertoire Extensions
pour stocker MongoSessionHandler
. Étant donné que les méthodes ci-dessus ne sont pas très faciles à comprendre, passons rapidement en revue chaque méthode : open
Méthode est généralement utilisé dans les systèmes de stockage de session basés sur des fichiers. Parce que Laravel est déjà livré avec un pilote de session file
. Vous n’avez donc pas besoin de mettre de code dans cette méthode. PHP nécessite une implémentation de cette méthode (ce qui est juste une mauvaise conception d'interface), il vous suffit de laisser cette méthode vide. - La méthode
close
est similaire à la méthode open
et peut généralement être ignorée. Pour la plupart des conducteurs, cette méthode n'est pas nécessaire. - La méthode
read
doit renvoyer le format de chaîne des données de session correspondant au $sessionId
donné. Il n'est pas nécessaire d'effectuer une sérialisation ou un autre codage lors de la récupération ou du stockage des données de session dans votre pilote personnalisé, car Laravel effectuera automatiquement la sérialisation pour vous. - La méthode
write
écrit la chaîne $data
associée à $sessionId
sur certains systèmes de stockage persistants tels que MongoDB, Dynamo, etc Encore une fois, vous n'avez pas besoin d'effectuer de sérialisation ou autre codage car Laravel gère cela automatiquement pour vous. - La méthode
destroy
supprimera les données liées à $sessionId
du stockage persistant. - La méthode
gc
détruit toutes les données avant le $lifetime
donné (horodatage UNIX). Pour les systèmes dotés de leur propre mécanisme d'expiration, tels que Memcached et Redis, cette méthode peut rester vide.
🎜🎜🎜🎜Enregistrement du conducteur🎜🎜Lorsque le conducteur est mis en œuvre, il doit être enregistré auprès du framework. Pour ajouter des pilotes supplémentaires au backend Laravel
, vous devez utiliser la méthode extend
de la façade Session
. Vous devez appeler la méthode extend
dans la méthode boot
du fournisseur de services. Vous pouvez effectuer cette opération sur un AppServiceProvider
existant ou créer un autre fournisseur de services : 🎜rrreee🎜Lorsque l'enregistrement du pilote est terminé, vous pouvez utiliser le fichier de configuration que config/session.php code> utilise le pilote mongo
. 🎜🎜Cet article a été publié pour la première fois sur le site 🎜LearnKu.com🎜. 🎜🎜