مقدمه
همانطور که میدانید آخرین نسخه Laravel 8.0
در September 8
منتشر شد. در این مقال قصد داریم ویژگی های جدیدی که در این فریم ورک محبوب و قدرتمند اضافه شده است را باهم برسی کنیم.
همانطور که میدانید لاراول در هر نسخه ای که انتشار میدهد ویژگی های را طبق آپدیت های PHP
و راه کار های جدید که هر توسعه دهنده را کنجکاو می کند ارایه می دهد. در این مقاله قصد داریم به ویژگی های مهم آن بپردازیم.
فقط نکته ای حائز اهمیتی که باید به آن اشاره کنم این است که Laravel
در طی نسخه های انتشار داده، در نسخه 6 LTS
طبق آماری که منتشر شده نسبت به سایر نسخه ها توسط لاراول پشتیبانی شده و مشکلات امنیتی و باگ های موجود و گزارش شده در آن رفع می شود و پایدارتر می باشد اگر نگاهی به جدول زیر بندازیم خواهیم فهمید نسخه 6 لاراول از نظر امنیتی تا سال 2022 پشتیبانی شده ولی با این حساب نمیشه از وپژگی های جدید لاراول گذشت.
ويژگی های جدید لاراول
بهترین ویژگی که در لاراول نسخه ۸ اضافه شد مفهومی به نام Jetstream
می باشد که یک داربست کاربردی با طراحی بسیار زیبا برای لاراول است که می تواند یک نقطه شروع ایده آل برای پروژه شما باشد.
حال علاوه بر این موارد زیر را به همراه داریم :
۱. Login/ Registration
۲. E-mail verification
۳. Two-factor authentication
۴. Session management
۵. API support via Laravel Sanctum
در ویژگی جدید لاراول همراه خود یک صفحه ورود جدید ارایه میدهد که دارای تم تیره و روشن می باشد که با استفاده از TailwindCSS
ایجاد شده است.حالا بریم یکی یکی ویژگی ها جدید لاراول و معرفی کنیم.
Route Caching Improvements
این ویژگی ذخیره سازی مبتنی بر closure-based
را پشتیبانی می کند، همانطور که میدانید قبل از لاراول ۸ ما می توانستیم مسیر های متنی بر کنترل ها را ذخیره کنیم و هر گونه closure-based
و ایجاد بسته جدید باعث خرابی مسیر ذخیره می شود ولی حالا این مشکل در نسخه جدید لاراول حل شده است.
Route::get('/clear-cache-all', function() {
Artisan::call('cache:clear');
dd("Cache Clear All");
});
Dynamic Blade Components && attributes
در این بخش تمام child components
ها داری ویژگی $attributes
هستند، در لاراول ۷ هنگامی که یک کامپونت را گسترش می دهید دکمه فرزند خصوصیات $attributes
را از خود نمی توانست رد کند.
<button {{'{{'}} $attributes }}>
{{'{{'}} $slot }}
</button>
همانطور که مشاهده می کنید دکمه مورد نظر می تواند خصوصیات خود را به والدش معرفی کند. این ویژگی به شما کمک می کند تا اجزای قابل توسعه بسازید.
گاهی اوقات شما نیاز دارید یک کامپونت را رندر کنید ولی نمی دانید که کدام جزء تا زمان رندر باید اجرا شود در همچین وضعیتی شما میتوانید از قابلیت جدید به نام x-dynamic-component
برای رندر کردن کامپونت بر اساس مقدار اجرا یا متغییر استفاده کنید.
<x-dynamic-component :component="$componentName" class="mt-4" />
Migration Squashing
این ویژگی برای برنامه ها و یا مهاجرت های بزرگ پایگاه داده مفید می باشد، این ویژگی جدید که به نام Schema Dumping
می باشد به شما کمک میکند که از پایگاه داده به خوبی نگهداری کنید.
هنگامی که برنامه شما بزرگ می شود تعداد فایل های Migration
شما هم به همان نسبت بزرگ می شود و نگهداری آن ها نسبتا سخت می کند به همین دلیل این ویژگی به شما کمک می کند با دستور زیر تمام آنها را در یک فایل SQL
فشرده یا squash
کنید.
همچنین پایگاه داده های MySQL
، PostgreSQL
و SQLite
- همه از این ویژگی پشتیبانی می کنند.
php artisan schema:dump
// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune
Models Directory
با توجه به تقاضای زیاد جامعه پشتیبانی لاراول پوشه پیش فرض model
ها به مسیر app/Models
منتقل شد و اگر این دایرکتوری وجود ندارد فریم ورک فرض می کند مسیر پیش فرض مدل های شما داخل پوشه app
می باشد.
Model Factory Classes
ویژگی جدید model factories
بر مبنای class based
به طور کامل باز نویسی شده، این ویژگی در حال حاضر قوی تر و سازگار با توسعه دهندگان می باشد در این ویژگی برای هر مدل می تواند یک factory class
وجود داشته باشد.
به لطفا وجود trait
جدید HasFactory
در مدل ایجاد شده می توانید برای ایجاد تعداد مشخص از آن مانند روش زیر عمل کنید:
use App\Models\User;
User::factory()->count(50)->create();
متد definition مجموعه ای از ویژگی ها بر می گرداند، آن را در زیر مشاهده کنید:
class UserFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}
از آنجایی که model factory
های شما از نوع کلاس PHP
ساده هستند همچنین می توانید تغییر حالت ها یا state transformations
به عنوان متد در کلاس خود اضافه کنید و میتوانید هر کلاس کمکی دیگر را به Eloquent model factory
اضافه کنید.
به عنوان مثال، ممکن است مدل کاربر شما بخواهد به حالت تعلق یا suspended state
در بیاید و یکی از ویژگی ها پیش فرض آن را تغییر بدهد. شما می توانید با استفاده از روش factory's state تغییرات حالت خود را تعریف کنید شما میتوانید روش حالت خود را با هر نامی که میخواهید نامگذاری کنید.
/**
* Indicate that the user is suspended.
*
* @return \Illuminate\Database\Eloquent\Factories\Factory
*/
public function suspended()
{
return $this->state([
'account_status' => 'suspended',
]);
}
حتی این ویژگی به شما این امکان را می دهد که از model factory
برای روابط بین جداول خود استفاده کنید.
$users = User::factory()
->hasPosts(3, [
'published' => false,
])
->create();
Improved Rate Limiting
این ویژگی محدودیت نرخ یا Rate Limiting
بهبود می بخشد، با این ويژگی میتواند مدیریت محدودیت نرخ را با انعطاف پذیری پیشرفته کنترل کنید.
شما می توانید با استفاده از RateLimiter facade
و متد for
که یک توابع بازگشتی را بر می گرداند پیکربندی route
هایی که باید محدود شوند را انجام دهید.
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000);
});
از آنجایی که تابع بازگشتی همراه خود HTTP
را برمی گرداند شما میتوانید تمام درخواست ها را به صورت دینامیک دریافت کنید.
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100);
});
گاهی اوقات ممکن است بخواهید محدویت نرخ را با مقادیر دلخواه کنترل کنید برای مثال شاید شما بخواهید به کاربران اجازه دهید در هر 100 دقیقه در هر ادرس IP
به یک مسیر مشخص دسترسی داشته باشند برای انجام این امر می توانید از کد زیر استفاده کنید.
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100)->by($request->ip());
});
همچنین میتوانید از ratelimiter
خود به عنوان middleware
در گروهی ازroute
ها در لاراول استفاده کنید
Route::middleware(['throttle:uploads'])->group(function () {
Route::post('/audio', function () {
//
});
Route::post('/video', function () {
//
});
});
Job Batching
این ویژگی به شما این مکان را می دهد که دسته از jobs
را به راحتی اجرا کنید و سپس بعد اتمام هر job
برخی از اقدامات را انجام دهید.
می توانید از متد batch
از facade Bus
برای ارسال دسته از job
ها استفاده کنید و در هنگام بازگشت در صورت تکمیل فراخوانی از متد های then, catch, finally
استفاده کنید.
$batch = Bus::batch([
new ProcessPodcast(Podcast::find(1)),
new ProcessPodcast(Podcast::find(2)),
new ProcessPodcast(Podcast::find(3)),
new ProcessPodcast(Podcast::find(4)),
new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
// All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
})->dispatch();
return $batch->id;
Routing Namespace Updates
در ویژگی های نسخه قبلی لاراول در فایل RouteServiceProvider
دارای خصوصیتی به نام $namespace
نامیده می شد. این پسوند فضای نامی یا namespace
کنترلر های شما را تغیین می کرد.
لاراول ۸ این ویژگی را حذف کرده است و شما میتوانید کلاس های کنترل خود را بدون مشکل در فایل routes
وارد کنید.
در نسخه های قبلی لاراول RouteServiceProvider
دارای یک ویژگی به نام $namespace
بود. مقدار این ویژگی به طور خودکار در تعاریف مسیر کنترل کننده و فراخوانی به action helper / URL::action
اضافه می شود. در لاراول ۸، این ویژگی به طور پیش فرض خالی است. این بدان معناست که هیچ پیشوند فضای نام خودکار توسط لاراول انجام نمی شود.
بنابراین ، در برنامه های جدید لاراول تعاریف مسیر کنترل کننده باید با استفاده از قاعده استاندارد PHP قابل فراخوانی باشد :
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
فراخوانی به روش های دیگر هم باید به شکل زیر باشد :
action([UserController::class, 'index']);
return Redirect::action([UserController::class, 'index']);
improved Maintenance Mode
در نسخه های قبلی لاراول ممکن است با استفاده از از دستور php artisan down
برنامه خود را به حالت تعمیر ببرید و ممکن است آدرس های مجاز یا "allow list" از IP
ها اجازه دسترسی به برنامه را داشته باشند. با استفاده از این ویژگی میتوانید با افزودن یک secret
در نسخه 8 لاراول آن را امن کنید.
می توانید از این پس به شکل زیر از یک secret استفاده کنید:
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
جمع بندی
من سعی کردم در این مقاله اکثر امکانات افزودن شده در نسخه 8 لاراول را شرح دهم، امیدورام از بکار گیری آنها در پروژه های خود لذت ببرید و همچنین برای کامل کردن اطلاعات خود لطفا به مستندات لاراول که آن را برای شما لینک کردم یک سر بزنید. امیدوارم این مقاله برای شما مفید باشد.