物联网

Laravel 项目中使用 Model shouldBeStrict

266 2024-02-03 01:24:00

你有了一个全新应用的想法。你安装了 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);
}

它做了三件事:

  1. 防止懒加载。
  2. 可以防止静默地丢弃属性。
  3. 可以防止访问丢失的属性。

防止懒加载

以下是懒加载的示例:

$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() 现在是我在每个应用上做的第一件事,它有助于防止我以后犯可能对应用程序有害的基本错误。