如果生产环境中不存在Laravel创建表

时间:2014-04-29 17:33:39

标签: php laravel

当环境设置为生产环境时,我需要使用数据库来存储与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中的hasTablehttp://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

这是因为应用程序的生命周期?我怎么能这样做......

1 个答案:

答案 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来动态地执行此操作,但不确定它是否是个好主意。