创建我们自己的会话处理程序

gia*_*kis 2 php session laravel-4

我正在尝试创建自己的会话处理程序。我找到了这个资源。问题在于,他对供应商目录进行了更改,这是我不想做的。

原因是,我正在与其他人合作,这是一个使用版本控制系统的协作项目(push主应用程序ignore供应商文件夹),除此之外,我认为composer install所有更改都将丢失(尽管我不确定) .

DatabaseSessionHandler突然想到要更改,毕竟,我想要的只是更改 Laravel 用于存储会话的表的字段名称(我正在处理预先存在的数据库),但这与我上面提到过。

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

链接将不胜感激。

更新

我想澄清的事情,我希望能够使用Laravels API

我发现的另一个资源是 Laravels doc how to write a session extension,但我认为缺少很多东西。它说我必须创建一个服务提供者,因为会话在请求生命周期的早期就开始了。有什么指示吗?

thp*_*hpl 5

它说我必须创建一个服务提供者,因为会话在请求生命周期的早期就开始了。有什么指示吗?

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

由于在app/config/app.phpLaravel 的引导过程中很早就注册了您的绑定,因此它是绑定您的自定义SessionHandler-Extension的理想场所。

基本上,您需要以下内容来解决您的问题:

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

让我们开始吧:

引导服务提供者:

文件告诉我们,加入我们的自定义服务提供商以下Illuminate\Session\SessionServiceProvider所以你app/config/app.php添加以下线下方laravel SessionServiceProvider:

'MyProject\Extension\CustomSessionServiceProvider',

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

创建服务提供者:

现在您确定正在加载服务提供者,我们将实现它。在服务提供者中,我们可以覆盖DatabaseSessionHandler我们将要做的 laravel 的绑定。

<?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
            );
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

LaravelDatabaseSessionHandler有两个依赖项。的一种实现ConnectionInterface和表名。两者都注入到我们的中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
    }

}
Run Code Online (Sandbox Code Playgroud)

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

就是这样。快乐编码并享受 Laravel 的乐趣!