在Laravel 5.1中更改会话文件名

10

Laravel在网站访问时会将自己的会话文件保存在/storage/framework/sessions文件夹中。每个会话文件的名称都是一个随机生成的字母数字唯一名称。但我想以某种方式重新命名这些文件并为其指定自定义名称,有两个选项:

  • 创建会话文件后手动更改文件名(通过创建、复制、替换)
  • 查找随机生成字母数字名称的函数,并使用我的方式来设置每个文件的唯一名称(该方法可能带来较少的问题)

我的主要目标是将每个用户的会话文件重命名为存储在我的数据库中的用户ID。因此,名称仍然是唯一的,唯一的区别是我可以比随机字母数字名称更轻松地搜索文件。

如果有人知道我如何执行上述任何一种方法或者您能想到更好的实现方式,那就太好了。非常感谢您的任何帮助!

编辑:最终我决定在此更新我所决定的内容。我决定不使用 Laravel 生成的内置会话文件,并意识到更容易制作自己的文件,并让每个客户端仅访问它。谢谢大家!

3个回答

1
Laravel有几个管理器类来管理基于驱动程序的组件的创建。这些包括缓存、会话、身份验证和队列组件。管理器类负责根据应用程序的配置创建特定的驱动程序实现。例如,SessionManager类可以创建文件、数据库、Cookie和各种其他会话驱动程序的实现。
每个管理器都包括一个扩展方法,可用于轻松地将新的驱动程序解析功能注入到管理器中。
要使用自定义会话驱动程序扩展Laravel,我们将使用extend方法来注册自定义代码:
您应该将会话扩展代码放置在AppServiceProvider的boot方法中。
实现SessionHandlerInterface

app/Providers/AppServiceProvider.php

<?php
namespace App\Providers;

use Session;
use Illuminate\Support\ServiceProvider;
use App\Handlers\MyFileHandler;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Session::extend('file', function($app)
        {
            return new MyFileHandler();
        });
    }
}

请注意,我们的自定义会话驱动程序应实现SessionHandlerInterface。该接口仅包含我们需要实现的一些简单方法。

app/Handlers/MyFileHandler.php

<?php
namespace App\Handlers;

use SessionHandlerInterface;

class MyFileHandler 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) {}

}

您可以从FileSessionHandler扩展MyFileHandler并覆盖相关方法。

扩展FileSessionHandler

app/Providers/AppServiceProvider.php

<?php
namespace App\Providers;

use Session;
use Illuminate\Support\ServiceProvider;
use Illuminate\Session\FileSessionHandler;
use App\Handlers\MyFileHandler;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Session::extend('file', function($app)
        {
            $path = $app['config']['session.files'];
            return new MyFileHandler($app['files'], $path);
        });
    }
}

app/Handlers/MyFileHandler.php

<?php
namespace App\Handlers;

use Illuminate\Filesystem\Filesystem;
use Illuminate\Session\FileSessionHandler;

class MyFileHandler extends FileSessionHandler
{
    public function __construct(Filesystem $files, $path)
    {
        parent::__construct($files, $path);
    }
}

您可以在扩展框架文档的“会话”部分中找到更多信息。

https://laravel.com/docs/5.0/extending#session


谢谢回复。然而,文件命名确切地发生在哪里?是在引导函数中的“myfile”部分吗?如果是这样,在那里使用“myfile”,所有会话文件都将具有静态名称,因为我怀疑引导不会被调用多次。我有什么遗漏吗? - Izy-

0

如果您的最终目标是搜索会话文件名,则无需更改它们。您可以将会话文件名保存在数据库表中(或另一个您选择的文件中)。您可以使用this link来获取文件名。

一列 -> 存储会话文件名

其他列 -> 存储您想要的其他信息

通过这种方式,您可以使用SQL更快地搜索和查找文件。


那当然是一种选择。但这需要创建新文件并将会话信息存储在其中,甚至可能是数据库。我的需求需要我不断地运行查询以从数据库中检索数据,几乎每5-10秒钟就要进行一次。文件可能更快,但我想如果我可以通过任何方式访问已经存在的文件,为什么要创建新文件并做同样的事情呢? - Izy-

0

使用中间件处理请求

\Illuminate\Session\Middleware\StartSession::class

Route::group(['middleware' => [\Illuminate\Session\Middleware\StartSession::class]], function () {

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接