使用需要数据库连接的ServiceProviders部署/安装Laravel应用程序

时间:2016-08-23 16:46:01

标签: php laravel migration

情境:
执行现有Laravel应用程序的新部署(即生产,Travis,本地等)

问题:
运行Laravel迁移时,运行php artisan migrate,它首先启动应用程序的实例,然后才能实际运行迁移。

实例化应用程序实例包括启动任何已注册的服务提供商。有时其中一个ServiceProvider可能依赖于与数据库的连接。

这最终意味着为了运行php artisan migrate,您必须已经迁移了数据库,否则您将收到错误:

  

[Illuminate \ Database \ QueryException] SQLSTATE [42S02]:
  未找到基表或视图:1146表' database.table'不存在......

潜在解决方案:

一种解决方案是将ServiceProvider中的任何调用包装在try - catch中以允许第一个artisan migrate执行,如下所示:

public function boot()
{
    $this->registerPolicies();

    foreach ($this->getPermissions() as $permission) {
        Gate::define($permission->name, function ($user) use ($permission) {
            return $user->hasPermission($permission);
        });
    }
}

protected function getPermissions()
{
    try {
        return Permission::with('roles')->get();
    } catch (\Illuminate\Database\QueryException $e) {
        return [];
    }
}

问题:
有没有更好的方法来完成这个部署过程,特别是不需要将代码添加到实际的ServiceProvider

0 个答案:

没有答案