Laravel 项目中使用 Model shouldBeStrict
你有了一个全新应用的想法。你安装了 Laravel,就可以开始了。你应该做的第一件事是什么?
对我来说,我会打开应用的服务提供者,转到 boot
方法并设置全局 Model::shouldBeStrict():
public function boot(): void
{
Model::shouldBeStrict();
}
将其打开后,它做了如下这些事:
public static function shouldBeStrict(bool $shouldBeStrict = true)
{
static::preventLazyLoading($shouldBeStrict);
static::preventSilentlyDiscardingAttributes($shouldBeStrict);
static::preventAccessingMissingAttributes($shouldBeStrict);
}
它做了三件事:
- 防止懒加载。
- 可以防止静默地丢弃属性。
- 可以防止访问丢失的属性。
防止懒加载
以下是懒加载的示例:
$articles = \App\Models\Article::get();
foreach ($articles as $article) {
echo "<li>" . $article->user->name . "</li>\n";
}
如果运行这个,它能输出你所需要的。不过它对 user 关联进行了懒加载,导致每个循环都有一个新的查询。
打开 shouldBeStrict
后,运行代码时你将通过错误获取即时反馈:
Attempted to lazy load [user] on model [App\Models\Article] but lazy loading is disabled.
防止静默地丢弃属性
以下是一个尝试更新一个非 fillable 字段的示例:
$user->fill(["remember_token" => "bar"]);
现在将会返回异常:
Add fillable property [remember_token] to allow mass assignment on [App\Models\User].
防止访问丢失的属性
让我们假设我们正试图在用户上显示一个可能不存在的属性:
{{ $user->nonexistant }}
默认情况下,Laravel 不会显示任何东西,因为该属性不存在。不过打开远哥模式后,将会报错:
The attribute [nonexistant] either does not exist or was not retrieved for model [App\Models\User].
这对于你拼写错误很由帮助:
{{ $user->emial }}
现在,如果搞砸了你会得到即时反馈。
打开 Model::shouldBeStrict() 现在是我在每个应用上做的第一件事,它有助于防止我以后犯可能对应用程序有害的基本错误。