در قسمت قبلی به مهمترین ویژگیهای لاراول 10 اشاره کردیم. اما ویژگیهای جدید لاراول 10 به موارد گفته شده محدود نمیشود و بهبودهای بسیار بیشتری از زمان عرضه نسخه 9 در این فریم ورک ایجاد شده است. از آن جایی که تیم لاراول هر هفته تغییراتی را در این فریم ورک عرضه میکند، موارد کاربردی بسیاری از عرضه نسخه 9 تا کنون اضافه شده است که دوست دارم آنها را با شما به اشتراک بگذاریم.
حالت strict یا سخت گیرانه در Eloquent
با استفاده از این حالت در برنامههای لاراولی خود، رفتارهای زیر فعال میشوند:
- جلوگیری از lazy load شدن روابط (همیشه مجبور به استفاده از eager load میشوید)
- ایجاد Exception هنگام مقداردهی attribute هایی که fillable نیستند
- ایجاد Exception هنگام دسترسی به مقدار attribute هایی که وجود ندارند یا از دیتابیس خوانده نشدهاند
حالت strict به طور معمول هنگام توسعه برنامهها استفاده میشود. با اضافه کردن کد زیر به متد ()boot یکی از service provider های برنامه، میتوانید از این حالت را فعال کنید.
Model::shouldBeStrict();
متد ()shouldBeStrict در اصل میانبری برای متدهای زیر است:
Model::preventLazyLoading();
Model::preventSilentlyDiscardingAttributes();
Model::preventsAccessingMissingAttributes();
متد raw value در لاراول 10
تا کنون برای دریافت تنها یک مقدار از نتیجه کوئری، از متد value استفاده میکردیم. اکنون با اضافه شدن متد ()rawValue این امکان وجود دارد که آن مقدار را توسط یک عبارت SQL ای دریافت کنیم.
$fullname = UserModel::where('id', $id)
->rawValue('CONCAT(`first_name`, " ", `last_name`)')
ایزوله کردن دستور های آرتیسان (artisan commands)
شما میتوانید با استفاده از اینترفیس Isolatable در دستورهای آرتیسانی خود، مطمئن شوید که این دستور در آن واحد تنها یک بار اجرا میشود.
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Isolatable;
class SendEmails extends Command implements Isolatable
{
// ...
}
اولین دستور آرتیسانی که قابلیت اجرای ایزوله برای آن فراهم شده است دستور artisan migrate میباشد. با استفاده از گزینه –isolated میتوان مطمئن شد که دو پردازش مختلف این دستور را به صورت همزمان اجرا نمیکنند.
دیکشنری برای متد slug در لاراول 10
پارامتر dictionary به متد slug در کلاس Str اضافه شده است که به کمک آن میتوان شیوه تبدیل کاراکترهای خاص را شخصی سازی کرد.
Str::slug('500$ bill'); // "500-bill"
Str::slug(
title: '500$ bill',
dictionary: ['@' => 'at', '$' => 'dollar']
); // "500-dollar-bill"
نمایش مسیر در خروجی توابع ()dd و ()dump
اکنون در خروجی توابع ()dd و ()dump میتوانید مسیر فایلی که تابع در آن صدا زده شده است را ببینید.
Collection::make([
'version' => App::version(),
])->dd();
/*
array:1 [▼ // routes/web.php:19
"version" => "9.39.0"
]
*/
کلاس لاتاری در لاراول 10
کلاس جدیدی با نام Lottery به فریم ورک اضافه شده است که میتواند callback ای را بر اساس مجموعهای از شانسهای داده شده صدا بزند. این قابلیت میتواند زمانی مفید باشد که شما فقط میخواهید کدی را برای درصدی از درخواستهای دریافتی خود اجرا کنید:
use Illuminate\Support\Lottery;
Lottery::odds(1, 20)
->winner(fn () => $user->won())
->loser(fn () => $user->lost())
->choose();
قوانین ارزیابی lowercase و uppercase
با استفاده از قانون ارزیابی lowercase میتوان مطمئن شد که ورودی کاربر شامل حروف بزرگ نمیشود. این قانون زمانی کاربرد دارد که شما نمیخواهید ورودی کاربر را در برنامه توسط کد به حالت lowercase تغییر دهید بلکه میخواهید مطمئن شوید خود کاربر تمام حروف را به صورت کوچک در ورودی قرار میدهد.
Validator::make(
['name' => 'Admin'],
['name' => 'required|string|lowercase']
);
قانون uppercase هم دقیقا کاری برعکس lowercase انجام میدهد و مطمئن میشود که ورودی کاربر تنها شامل حروف بزرگ است.
متد ()whenMissing در کلاس Request
با استفاده از این متد میتوان یک callable را در شرایطی که کلید مورد نظر در ورودی مقدار ندارد، اجرا کرد.
$request->whenMissing('name', function ($value) use (&$name) {
$name = 'Taylor';
});
متد ()withWhereHas
ممکن است گاهی اوقات بخواهید موجود بودن یک رابطه را بررسی کنید و به طور همزمان بخواهید آن رابطه را با همان شروط eager load کنید. برای نمونه ممکن است بخواهید تنها User هایی را از دیتابیس بخوانید که دارای Post هایی با یک شرط خاص هستند و در عین حال همان Post ها را برای کاربران eager load کنید. این کار با متد withWhereHas انجام میشود.
use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
$users = User::withWhereHas('posts', function (Builder $query) {
$query->where('featured', true);
})->get();
قانون ارزیابی Decimal
این قانون جدید برای بررسی اعداد اعشاری با قابلیت پیکربندی حداقل و حداکثر تعداد اعشار اضافه شده است. این قانون به صورت زیر کار میکند:
- decimal:2 عدد وارد شده باید دو رقم اعشار داشته باشد
- decimal:2,3 باید دو یا سه رقم اعشار داشته باشد
- decimal:0,3 نباید بیشتر از سه رقم اعشار داشته باشد و میتواند بدون اعشار باشد
متد whenHas در کلاس JsonResource
با این متد در api resource ها میتوان یک کلید را بر اساس شرط وجود داشتن یک attribute در مدل نمایش داد.
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->whenHas('email'),
];
}
متد unless در کلاس JsonResource
با استفاده از این متد در api resource ها، یک کلید تنها زمانی نمایش داده میشود که شرط داده شده false باشد.
public function toArray($request)
{
$someCondition = false;
return [
'id' => $this->id,
'name' => $this->name,
// Email will be included, with `true` will not.
'email' => $this->unless($someCondition, 'email'),
];
}
متد ()incrementEach
با استفاده از این متد در api resource ها، میتوان مقدار چندین ستون را توسط یک کوئری افزایش داد.
DB::table('products')->where('id', 2)->incrementEach([
'in_store' => 2,
'in_stock' => 3,
'total' => 5,
], ['updated_at' => now()]);
تبدیل آرایه ای از Enum ها
گاهی اوقات ممکن است نیاز شود آرایهای از enum ها را در ستونی از دیتابیس ذخیره کنیم. برای راحتی کار، لاراول دو cast جدید اضافه کرده است.
با کمک این cast ها دیگر نیاز نیست هنگام ذخیره، آرایهای از شیءهای enum را به آرایهای از رشتهها تبدیل کنیم و یا هنگام خواندن مقادیر از دیتابیس، آرایهای از رشتهها را به آرایهای از شیهای enum تبدیل کنیم.
use App\Enums\ServerStatus;
use Illuminate\Database\Eloquent\Casts\AsEnumArrayObject;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'statuses' => AsEnumArrayObject::class.':'.ServerStatus::class,
];
متد keyBy در کلاس Arr
این متد دقیقا عملکردی مشابه متد keyBy در Collection دارد.
$array = [
['id' => '123', 'data' => 'abc', 'device' => 'laptop'],
['id' => '345', 'data' => 'def', 'device' => 'tablet'],
['id' => '345', 'data' => 'hgi', 'device' => 'smartphone'],
];Arr::keyBy($array, 'id');
/*
[
'123' => ['id' => '123', 'data' => 'abc', 'device' => 'laptop'],
'345' => ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone']
// The second element of an original array is overwritten by the last element because of the same id
]
*/
ادغام شدن پکیج Laravel CORS
از این پس هنگامی که یک نسخه جدید از لاراول را نصب میکنید، پکیج fruitcake/laravel-cors در composer.json جز وابستگیهای پروژه نیست! زیرا کدهای این پکیج داخل فریم ورک ادغام شده است.
متد ()wrap برای رشتهها
با استفاده از این متد میتوان مشخص کرد که یک رشته توسط رشتهای دیگر در بر گرفته شود. برای نمونه خروجی کدهای زیر مقدار "value" خواهد بود.
Str:wrap('value')->wrap('"');
Str::of('value')->wrap('"');
str('value')->wrap('"');
همچنین خروجی کدهای زیر مقدار This is me! خواهد بود.
Str:wrap('is', 'This ', ' me!');
Str::of('is')->wrap('This ', ' me!');
str('is')->wrap('This ', ' me!');
متد freezeTime در لاراول 10
این متد برای نگه داشتن زمان در اجرای تستها کاربرد دارد.
public function test_something()
{
$this->freezeTime();
}
این متد میتواند به جای کدهای زیر استفاده شود:
Carbon::setTestNow(now());
$this->travelTo(Carbon::now());
متد whereBelongsTo در لاراول 10
زمانی که میخواهیم تمام رکوردهای مربوط به یک رابطه belongs to را دریافت کنیم، از متد where مانند زیر استفاده میکنیم:
$posts = Post::where('user_id', $user->id)->get();
در نسخه جدید لاراول متد ()whereBelongsTo برای راحتی کار اضافه شده است. کافی است به این متد، مدل مورد نظر را بدهید تا خودش رابطه و کلید خارجی درست را پیدا کند.
$posts = Post::whereBelongsTo($user)->get();
همچنین شما میتوانید collection ای از مدلها را به این متد بدهید تا لاراول تمام مدلهای مربوط به آنها را از دیتابیس بخواند.
در این مقاله سعی شد بخش قابل توجهی از ویژگیهای جدید و کاربردی لاراول در یک سال اخیر مطرح شود و در قسمت سوم به بخشهای دیگر آن خواهیم پرداخت. امیدوارم از خواندن این مقاله لذت برده باشید و از قابلیتهای جدید، در پروژههای خود استفاده کنید.