当环境设置为生产环境时,我需要使用数据库来存储与Laravel 4的会话。当它本地时,可以使用标准文件驱动器系统。
我无法访问命令行,因此我无法运行任何迁移,工匠命令(CloudFoundry设置)。所以我的想法是,在我的app/start/global.php
文件中添加支票:
if (App::environment('production'))
{
if(! Schema::hasTable( Config::get('session.table') )) {
Schema::create( Config::get('session.table'), function($table)
{
$table->string('id')->unique();
$table->text('payload');
$table->integer('last_activity');
});
}
}
如果它当前处于生产模式(此位有效),则检查是否存在我的app/config/session.php
文件中定义了名称的表。如果没有,则使用该给定名称创建此表。我注意到api中的hasTable
(http://laravel.com/api/4.1/Illuminate/Database/Schema/Builder.html#method_hasTable)。
但是,当我的应用加载时,我收到错误:
RuntimeException: PDOException was thrown when trying to read the session data: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'table_name.sessions' doesn't exist
这是因为应用程序的生命周期?我怎么能这样做......
答案 0 :(得分:1)
您无法执行此操作,因为会话在加载global.php
文件之前启动。为了更具描述性,会话在Illuminate\Session\Middleware
方法的handle
文件中启动,在handle
方法中您可以看到:
if ($this->sessionConfigured())
{
$session = $this->startSession($request);
$request->setSession($session);
}
这在框架的引导过程中发生,之后调用$app->booted
,其中包含global.php
文件:
// Inside booted handler
$path = $app['path'].'/start/global.php';
if (file_exists($path)) require $path;
因此,在调用session table
之前需要Illuminate\Session\Middleware\handle
。您应该手动创建table
,如果环境是生产环境,那么将使用该表,否则将无法使用该表。那么,如果你总是在database
中保留一张桌子,会出现什么问题?
我也是这么想的,也许你可以创建一个自定义middleware
来动态地执行此操作,但不确定它是否是个好主意。