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

时间:2014-06-18 08:34:26

标签: php session laravel-4

我试图创建自己的会话处理程序。我发现了resource。问题在于,他对 vendor 目录进行了更改,这是我不想要的。

原因是,我与其他人合作,它是一个使用版本控制系统的协作项目(push主要应用程序ignore供应商文件夹)我假设每个composer install所有的变化都会丢失(虽然我不确定)。

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

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

链接将不胜感激。

更新

我想澄清的一点,我希望能够使用Laravel s API

我发现的另一个资源是Laravels doc how to write a session extension,但我认为很多东西都缺失了。它说我必须创建一个服务提供者,因为会话在请求生命周期的早期就开始了。从那里的任何方向?

3 个答案:

答案 0 :(得分:4)

  

它说我必须创建一个服务提供者,因为会话在请求生命周期的早期就开始了。从那里的任何方向?

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

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

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

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

让我们开始吧:

引导服务提供商:

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

'MyProject\Extension\CustomSessionServiceProvider',

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

创建服务提供商:

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

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

}

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

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

Laravels DatabaseSessionHandler有两个依赖项。 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
    }

}

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

就是这样。快乐的编码和Laravel玩得开心!

答案 1 :(得分:1)

实施时,请确保锁定会话,因为这经常被遗忘并导致会话修改不可靠。欲了解更多信息,请阅读:

http://www.leaseweblabs.com/2013/10/symfony2-memcache-session-locking/

答案 2 :(得分:-1)

您可以使用SessionHandlerInterface

class MySessionHandler implements SessionHandlerInterface {    

// implememntation

}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

参考

http://www.php.net/manual/en/class.sessionhandlerinterface.php