php - 创建我们自己的 session 处理程序

标签 php session laravel-4

我正在尝试创建自己的 session 处理程序。我找到了这个 resource .问题是他更改了 vendor 目录,这是我不想做的。

这样做的原因是,我正在与其他人合作,这是一个使用版本控制系统的协作项目(推送主应用程序忽略供应商文件夹)和除此之外,我假设每次安装 composer 时,所有更改都将丢失(尽管我不确定)。

我想到了更改 DatabaseSessionHandler,毕竟,我想要的只是更改 Laravel 用于存储 session 的表的字段名称(我正在研究一个预现有数据库),但它与我上面提到的相同。

有什么方法可以创建我自己的 session 处理程序并在我的应用程序中使用它? 服务提供商还是更好的东西?

链接将不胜感激。

更新

有些事情我想澄清一下,我希望能够使用 LaravelAPI .

我找到的另一个资源是 Laravels 文档 how to write a session extension ,但我认为缺少了很多东西。它说我必须创建一个服务提供者,因为 session 在请求生命周期的早期就开始了。从那里有什么方向吗?

最佳答案

It says I have to create a service provider cause sessions are started very early in the request-lifecycle. Any directions from there?

这实际上意味着您必须在 IoC-Container 中注册一个 session 服务提供者。在请求生命周期的早期。

由于 app/config/app.php 中的绑定(bind)将在 laravel 的引导过程中很早就注册,因此它是绑定(bind)自定义 SessionHandler-扩展。

基本上你需要以下东西来解决你的问题:

  • 将 SessionHandlerInterface(您的具体自定义 session 处理程序)的新实例绑定(bind)到 IoC 容器的服务提供者
  • 并编辑您的 app/config/app.php 以添加您的新服务提供商
  • 您的自定义 session 处理程序类

让我们开始吧:

引导服务提供者:

Docs告诉我们在 Illuminate\Session\SessionServiceProvider 下方 添加我们的自定义服务提供商,因此在您的 app/config/app.php 中添加以下行在 laravel SessionServiceProvider 下面:

'MyProject\Extension\CustomSessionServiceProvider',

现在在 laravels 引导过程中 CustomSessionServiceProvider 将在 laravels 之后立即加载。在我们的自定义提供程序中,我们将进行实际绑定(bind)。

创建服务提供者:

现在您已确定正在加载服务提供者,我们将实现它。 在服务提供者中,我们可以覆盖我们将要执行的 laravels DatabaseSessionHandler 的绑定(bind)。

<?php namespace MyProject\Extension;

use Illuminate\Support\ServiceProvider;
use Session;

class CustomSessionServiceProvider extends ServiceProvider {

    public function register()
    {
        $connection = $this->app['config']['session.connection'];
        $table = $this->app['config']['session.table'];

        $this->app['session']->extend('database', function($app) use ($connection, $table){
            return new \MyProject\Extension\CustomDatabaseSessionHandler(
                $this->app['db']->connection($connection),
                $table
            );
        });
    }

}

首先,我们获取用于存储 session 的连接类型,然后获取将存储 session 的表。

由于您只想更改列名,我们不需要实现全新的数据库 session 处理程序。相反,让我们扩展 Laravels Illuminate\Session\DatabaseSessionHandler 并覆盖必要的方法。

Laravels DatabaseSessionHandler 有两个依赖项。 ConnectionInterface 的实现和表名。两者都被注入(inject)到我们的 CustomDatabaseSessionHandler 中,您可以在上面看到。

然后我们只需在闭包中返回我们的 CustomDatabaseSessionHandler

创建实际的 CustomDatabaseSessionHandler

现在我们已准备好启动新的 CustomDatabaseSessionHandler,让我们来创建它吧。

没什么可做的。只有四种方法使用硬编码列。我们将只扩展 Illuminate\Session\DatabaseSessionHandler 类并覆盖这四个。

<?php namespace MyProject\Extension;

use Illuminate\Session\DatabaseSessionHandler;

class CustomDatabaseSessionHandler extends DatabaseSessionHandler {

    public function read($sessionId)
    {
        // Reading the session
    }

    public function write($sessionId, $data)
    {
        // Writing the session
    }

    public function destroy($sessionId)
    {
        // Destryoing the Session
    }

    public function gc($lifetime)
    {
        // Cleaning up expired sessions
    }

}

因为您只想更改列名,您甚至可以从父类复制方法主体,然后只更改您想要的内容。

就是这样。快乐编码,享受 Laravel 带来的乐趣!

关于php - 创建我们自己的 session 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24280781/

相关文章:

PHP - 如何在字符串末尾添加特定字符?

php - 乔姆拉 2.5。不显示注册表单验证消息

php - Symfony2 bundle : am I using them right?

symfony - 防止更新特定 Controller 的 MetadataBag 中的 LastUsed

php - 更新 Created_at 时间戳 Laravel 数据库播种

php - 在 PHP 中舍入和格式化货币

javascript - Socket.IO,导航器选项卡出现问题

java - 在 IBM Notes Agent 中获取 session token 时出错

authentication - Laravel-验证 session 在浏览器关闭后不会过期

php - 如何通过引用 Blade 模板中的@include 来传递变量?