我正在尝试创建自己的 session 处理程序。我找到了这个 resource .问题是他更改了 vendor 目录,这是我不想做的。
这样做的原因是,我正在与其他人合作,这是一个使用版本控制系统的协作项目(推送
主应用程序忽略
供应商文件夹)和除此之外,我假设每次安装 composer
时,所有更改都将丢失(尽管我不确定)。
我想到了更改 DatabaseSessionHandler
,毕竟,我想要的只是更改 Laravel 用于存储 session 的表的字段名称(我正在研究一个预现有数据库),但它与我上面提到的相同。
有什么方法可以创建我自己的 session 处理程序并在我的应用程序中使用它? 服务提供商还是更好的东西?
链接将不胜感激。
更新
有些事情我想澄清一下,我希望能够使用 Laravel
的 API .
我找到的另一个资源是 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/