从前端更改Laravel配置设置?

时间:2016-06-03 15:04:40

标签: laravel laravel-5

我正在使用Laravel 5.0。我需要能够从前端更改config/session.php中会话生存期的值,使值可配置为我站点的管理员用户。

在我已经阅读的文档中,您可以使用配置帮助函数来获取/设置变量,如下所示:

    config(['session.lifetime' => '60']);

    config('session.lifetime'); // '60'

但它只会更改该请求的配置值。如何保持此配置,使其适用于所有请求?

2 个答案:

答案 0 :(得分:2)

这个答案可能很愚蠢,尝试会话闪存一个有变化的对象。然后植入一个中间件,它接受会话中闪现的内容并重做配置更改,然后重新刷新。

$whatever_to_change = ['session.lifetime' => '60'];
session()->flash('changes', $whatever_to_change);
config($whatever_to_change);

在中间件中:

$from_flash = session()->get('changes');
config($whatever_to_change);
session()->keep(['changes']);

然后在其他路线中使用此中间件。我想如果你想改变会话驱动程序,这可能不起作用。

答案 1 :(得分:1)

我建议实现一个自定义会话驱动程序,它从数据库中读取生命周期值。

这很简单,你只需要覆盖GC(垃圾收集)方法,并创建一个数据库表来存储这个值。

我过去曾做过这样做,以便为分析目的进行软删除数据库会话。如果您需要任何代码段,请与我们联系。

编辑:使用代码,我的问题略有不同,所以我编辑了一些关键组件,但这并不是假装完整的解决方案:

我在应用下创建了一个名为Library\Session的文件夹,用于存储新的SessionHandler

<?php

namespace App\Library\Session;

use DB;

class DynamicallyConfiguredDatabaseSessionHandler extends \Illuminate\Session\DatabaseSessionHandler
{

    /**
     * {@inheritdoc}
     */
    public function read($sessionId)
    {
        $session = (object) $this->getQuery()->find($sessionId);

        if (isset($session->payload)) {
            $this->exists = true;

            return base64_decode($session->payload);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function write($sessionId, $data)
    {
        if ($this->exists) {
            $this->getQuery()->where('id', $sessionId)->update([
                'payload' => base64_encode($data), 'last_activity' => time(),
            ]);
        } else {
            $this->getQuery()->insert([
                'id' => $sessionId, 'payload' => base64_encode($data), 'last_activity' => time()
            ]);
        }

        $this->exists = true;
    }

    /**
     * {@inheritdoc}
     */
    public function destroy($sessionId)
    {
        $this->getQuery()->where('id', $sessionId)->delete();
    }

    /**
     * {@inheritdoc}
     */
    public function gc($lifetime)
    {
        $dynamic_lifetime = DB::select('select lifetime from config limit 1');
        $this->getQuery()->where('last_activity', '<=', time() - $dynamic_lifetime)->delete();
    }

}

然后在config/session.php设置'driver' => 'dynamically_configured_database'

然后在App\Providers\AppServiceProvider中使用此boot()方法:

public function boot()
{   
    //This is seriously the only way to modify how sessions work
    \Session::extend('dynamically_configured_database', function() {
        $connection = $this->app['config']['session.connection'];

        $connection = $this->app['db']->connection($connection);
        $table = $this->app['config']['session.table'];

        return new \App\Library\Session\DynamicallyConfiguredDatabaseSessionHandler($connection, $table);
    }); 
} 

要确保每次在指定时间段结束时销毁会话,请更改session.php中的垃圾收集彩票赔率,如下所示:

'lottery' => [1, 1],

准备这个需要花一点时间,我很想听听您在自定义数据库驱动程序中添加更简单方法的经验教训,但是一旦我开始工作它还没有任何问题。