
پنج ویژگی لاراول برای کدنویسی تمیز و فشرده
لاراول ویژگیهای متعددی ارائه میدهد که به شما کمک میکنند تا کدهایی تمیز و فشرده بنویسید. در این مقاله، با 5 قابلیت لاراول که باعث بهبود و فشردهتر شدن کدنویسی شما میشوند، آشنا خواهید شد.
()tap
تصور کنید باید متدی ایجاد کنید که دادههای جدید عکس را به پایگاه داده اضافه کند و سپس مدل مربوط به آن دادهها را برگرداند. متدهای save()
یا update()
در Eloquent مقدار بولی (true یا false) برمیگردانند، اما مدل جاری را باز نمیگردانند. برای بازگرداندن مدل، باید کد زیر را بنویسید.
<?php
use App\Models\Photo;
public function addPhoto(): Photo
{
$photo = new Photo();
$photo->name = 'Photo 1';
$photo->path = '/path/to/photo';
$photo->save();
return $photo;
}
public function updatePhoto($id, $data): Photo
{
$photos = Photo::find($id);
$test = $photos->update($data);
return $photos;
}
اگر از کمک کننده ()tap استفاده کنید، کد شما فشرده تر خواهد شد:
use App\Models\Photo;
public function addPhoto(): Photo
{
return tap(new Photo(), function ($instance) {
$instance->name = 'Photo 1'; // $instance is a Photo model
$instance->path = '/path/to/photo';
$instance->save();
});
}
public function updatePhoto($id, $data): Photo
{
return tap(Photo::find($id))->update($data);
};
اولین پارامتر tap()
به عنوان خروجی بازمیگردد و پارامتر دوم یک تابع ناشناس است که پارامتر اول را به عنوان آرگومان دریافت میکند.
شرطهای متنی با ()when
فرض کنید کاربری یک فیلد اختیاری ارسال میکند. اگر این فیلد وجود داشته باشد و مقدارش درست باشد، باید رکوردها را جستجو کنیم. بدون استفاده از متد when()
، کد شما به شکل زیر خواهد بود:
$role = $request->input('role');
$photos = Photo::where('path', 'path/to/file');
// In this example, you can also use
// $request->has('role') method for check
if($role) {
$photos->where('role_id', $role);
}
dump($photos->get());
با استفاده از when()
کد سادهتر میشود:
$photos = Photo::where('path', 'path/to/file')
->when($role, function ($query, $role) {
$query->where('role_id', $role);
})
->get();
dump($photos);
()Number::abbreviate
این متد به شما کمک میکند تا اعداد را به فرمتی خوانا در Blade نمایش دهید:
<span class="count">
{{ Number::abbreviate(500000) }} Output: 500K
</span>
You can also set the precision
<span class="count">
{{ Number::abbreviate(525678, precision: 2) }} Output: 525.68K
</span>
()abort_if
فرض کنید نیاز به پرتاب استثناها بر اساس شرایطی خاص دارید. این کار به صورت زیر انجام میشود:
$forbidden = true; // Some variable
if($forbidden) {
abort(403, 'You don't have access');
}
یا میتوانید از متد abort_if()
استفاده کنید:
$forbidden = true;
abort_if($forbidden, 403, 'You don't have access');
()Arr::toCssClasses
تصور کنید در Blade میخواهید بسته به شرایط خاصی، کلاسهایی را به یک عنصر HTML اضافه کنید. بدون استفاده از متد Arr::toCssClasses()
، مجبور خواهید بود از تعداد زیادی دستورات شرطی استفاده کنید که نه تنها خوانا نیستند، بلکه مدیریت آنها هم دشوار است.
در مثال زیر، خروجی کلاسها به این شکل خواهد بود: <div class="result active ">
. متأسفانه، وجود فاصلههای اضافی در کلاسها باعث میشود حذف این فاصلهها دشوار باشد.
@php
// Some variables
$status = true;
$error = false;
@endphp
<div class="result @if($status) active @endif @if($error) error @endif">
Lorem...
</div>
حالا بیایید از متد Arr::toCssClasses()
استفاده کنیم. فقط کلیدهایی که مقدارشان true
است، نمایش داده میشوند. در این مثال، کلاسها بدون فاصله اضافی به این شکل خواهند بود: <div class="result active">
و کد خواناتر خواهد شد. Arr::toCssClasses
کلاسها را بر اساس یک آرایه و شرایط مشخص تولید میکند.
@php
$status = true;
$error = false;
// Array with classes
$classes = ['result', 'active' => $status, 'error' => $error];
@endphp
<div class="{{ Arr::toCssClasses($classes) }}">
Lorem...
</div>