شروع لاراول با shouldBeStrict چرا و چگونه؟
همیشه وقتی داریم پروژهای رو شروع میکنیم به خودمون قول میدیم که کدهای تمیزی میزنم ولی هرچی بیشتر توی پروژه پیش میریم فراموش میکنیم که چه قولی به خودمون دادیم، shouldBeStrict نمیذاره چیزی رو فراموش کنی 😜
shouldBeStrict چیه و چیکار میکنه؟
درواقع یک متد هست که به Illuminate\Database\Eloquent\Model اضافه شده و جلوگیری میکنه از یکسری کار هایی که باعث میشه پروژه شما کارایی و سرعت خودش رو از دست بده.
وقتی از این قابلیت استفاده کنید این ۳تا کار رو برای شما انجام میده
- جلوگیری از lazy load کردن رابطه ها
- جلوگیری از آپدیت فیلدهایی که توی مدل تعریف نشدن به عنوان fillable
- جلوگیری از دسترسی به فیلدهایی که وجود خارجی ندارند (به اشتباه صدا زده شدند)
خب چندتا مثال ببینیم که قشنگتر موضوع براتون جا بیوقته و درکش کنید:
Preventing Lazy Loading
$articles = \App\Models\Article::get();
foreach ($articles as $article) {
echo "<li>" . $article->user->name . "</li>\n";
}Code language: PHP (php)
❌ در حالت عادی با اجرای کد بالا هیچ خطایی دریافت نمیکنید ولی اگر تعداد Query هایی که به سمت دیتابیس ارسال شده رو بررسی کنید متوجه میشید که یچیزی اشتباه هست و پروژه شما به مشکل n+1 query خورده.
اگر shouldBeStrict رو روشن کنید بلافاصله به خطای زیر مواجه میشید
Attempted to lazy load [user] on model [App\Models\Article] but lazy loading is disabledCode language: CSS (css)
Prevent Silently Discarding Attributes
$user->fill(["remember_token" => "bar"]);Code language: PHP (php)
❌ کد بالا هم خطایی به شما نمیده ولی چون فیلد شما به عنوان fillable اضافه نشده ازش چشم پوشی میکنه.
اگر shouldBeStrict رو روشن کنید بلافاصله به خطای زیر مواجه میشید
Add fillable property [remember_token] to allow mass assignment on [App\Models\User].Code language: CSS (css)
Prevent Accessing Missing Attributes.
{{ $user->nonexistant }}Code language: PHP (php)
❌ برای من که خیلی پیش امده یه فیلد رو فراخوانی کنم ولی نتیجهای نگیرم، باید برم model رو چک کنم و ببینم اسم فیلد رو درست نوشتم یا نه.
اگر shouldBeStrict رو روشن کنید بلافاصله به خطای زیر مواجه میشید
The attribute [nonexistant] either does not exist or was not retrieved for model [App\Models\User].Code language: CSS (css)
✅ حالا اولین چیزی که من توی هرکدوم از پروژه هام انجام میدم روشن کردن حالت shouldBeStrict هست.
برای این کار کافیه فقط توی یکی از Provider های پروژتون کد زیر رو استفاده کنید.
// app/Providers/AppServiceProvider.php
public function boot(): void
{
Model::shouldBeStrict();
}Code language: PHP (php)
این متد توی لاراول Laravel 9.35 معرفی شده و برای استفاده باید پروژتون رو اول آپدیت کنید.
امیدوارم از آموزش امروز هم خوشتون آمده باشه 🦄
