情境:
执行现有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
?