سلام دوستان لاراولی! می‌خوایم دومین قسمت از مجموعه پست‌های ۸۰ سوال مصاحبه لاراول رو بررسی می‌کنیم. پیشنهاد می‌کنم قبلش مقدمه و قسمت نکته دوستانه رو بخونین.

سوالاتی توی این قسمت بررسی می‌کنیم:

  1. Service Provider چیه؟
  2. ماکرو (Macro) چیه؟
  3. softDelete الوکوئنت چیه و چطوری اون رو فعال کنیم؟
  4. Route Model Binding چیه؟
  5. کد زیر چکار می‌کنه؟
  6. چه دستورات آرتیزان برای بهینه‌سازی برنامه می‌شناسید؟
  7. Throttle چیه و چطوری اون رو فعال کنیم؟
  8. روت‌های Named چه کاربردی دارن؟
  9. روت‌های Resource چه کاربردی دارن؟
  10. Service Container چیه؟

 

11. Service Provider چیه؟

هر برنامه‌ای (حتی غیر لاراولی) برای اینکه اجرا بشه باید چندین کلاس و فایل رو لود و اجرا کنه. سرویس‌هایی مثل کش، سشن، کوکی، دیتابیس و ... باید از قبل لود بشن تا برنامه‌ی ما کار اصلیش رو انجام بده. این لود شدن‌ها توسط قسمت Service Provider ها انجام میشه. این قسمت مسئول پیکربندی و آماده‌سازی پروژه هست.

برای آشنایی با Service Provider لاراول این پست رو بخونین.

 

12. ماکرو (Macro) چیه؟

با ماکرو می‌تونیم به یک کلاس داخلی فریم‌ورک مثلا Request یا Response متدهای دلخواه اضافه کنیم و اون رو توسعه بدیم. این اضافه کردن موقع Run-Time رخ میده. با ماکرو، کلاس‌هایی رو میشه توسعه داد که از یک Trait به اسم Macroable استفاده می‌کنن. برای مثال می‌خوایم به کلاس Request یک قابلیت جدید اضافه کنیم:

Request::macro('hello', function($argument) {
    return 'Hello';
});

و از اون می‌تونیم به این صورت اضافه کنیم:

echo Request::hello(); // Hello

برای آشنایی با ماکروهای لاراول این پست رو ببینید.

 

13. softDelete الوکوئنت چیه و چطوری اون رو فعال کنیم؟

اگه بخوایم رکوردهای یک جدول بعد از حذف شدن توسط دستور ...->delete() فریم‌ورک در دسترس باشن، از تکنیک softDelete استفاده می‌کنیم. یعنی بعد از حذف، رکوردها و اطلاعات وجود دارن، اما دیگه برای کوئری‌های بعدی در نظر گرفته نمیشن. این تکنیک برای زمانی خوبه که اطلاعات بعد از حذف، همچنان برای ما با اهمیت هستن. شاید هم بخوایم در آینده اونها رو بازیابی کنیم.

برای پیاده‌سازی این تکنیک ابتدا باید توی هر مدلی که می‌خوایم softDelete برای اطلاعات اون جدول فعال باشه، یک Trait اضافه کنیم به اسم SoftDeletes:

<?php

// ...
use Illuminate\Database\Eloquent\SoftDeletes;

class Penguin extends Model
{
    use SoftDeletes;
}

مرحله بعد باید یک ستون به اسم deleted_at به جدولمون اضافه کنیم. این ستون از نوع timestamp هست و اون رو میشه با دستور زیر توی مایگریشن اضافه کرد:

public function up()
{
    Schema::table('penguins', function (Blueprint $table) {
        $table->softDeletes();
    });
}

از حالا به بعد وقتی هر رکوردی با دستور $item->delete() پاک بشه، مقدار ستون deleted_at پر و شامل تاریخ حذف میشه. رکوردی که ستون deleted_at برای اون null نباشه یعنی حذف شده.

 

14. Route Model Binding چیه؟

کد زیر رو در نظر بگیرید که داریم یک کاربر رو با پارامتر $id بطور دستی پیدا کنیم:

// Route::get('user/{id}', 'UserController@show');

public function show($id)
{
    $user = User::findOrFail($id);
    
    dd($user);
}

توی بیشتر مواقع پارامتر $id شناسه یک رکورد توی جدول دیتابیس هست و کدی که نوشتیم توی خیلی از جاهای برنامه داره بصورت دستی تکرار میشه. یعنی خوندن پارامتر و فراخونی از دیتابیس. لاراول یک ویژگی رو در اختیار ما گذاشته تا "عملیات خوندن پارامتر و فراخونی رکورد از دیتابیس" بصورت خودکار انجام بگیره. به این تکنیک می‌گن Route Model Binding.

با استفاده از این تکنیک، کد بالا رو می‌تونیم اینطوری بنویسیم:

// Route::get('user/{user}', 'UserController@show');

public function show(User $user)
{
    dd($user);
}

برای آشنایی کامل با این تکنیک، این پست رو بخونین.

 

15. کد زیر چکار می‌کنه؟

return redirect()->away('https://www.google.com');

متد away() از کلاس redirect برای هدایت کردن کاربر به یک آدرس خارجی استفاده میشه. وقتی می‌خوایم کاربر رو به یک آدرس خارجی منتقل کنیم، بهتره که از متد away() استفاده کنیم. چون با این روش هیچ اعتبارسنجی روی مسیر وارد شده انجام نمیشه.

برای آشنایی با فوت و فن‌های ریدایرکت لاراول، می‌تونید این پست رو بخونین.

 

16. چه دستورات آرتیزان برای بهینه‌سازی برنامه می‌شناسید؟

لاراول برای افزایش سرعت برنامه، شامل دو دستور آرتیزان config:cache و route:cache هست.

دستور config:cache همه متغیرها و مقدارهای پوشه config رو کش می‌کنه. این پوشه شامل بیشتر از ۱۰ تا فایل جدا هست که کش کردن و مجتمع کردن اونها توی یک فایل، سرعت برنامه رو تا حد زیادی بالا می‌بره.

اجرای دستور route:cache که به طور جدی توسط خود لاراول پیشنهاد شده، سرعت رجیستر کردن روت‌های لاراول رو ۱۰۰ برابر افزایش میده و سرعت اجرای برنامه رو بطور چشمگیری افزایش میده.

نکته: دستور قدیمی php artisan optimize از لاراول حذف شده.

 

17. Throttle چیه و چطوری اون رو فعال کنیم؟

با Throttle که به اون Rate Limiter هم گفته میشه، می‌تونیم تعیین کنیم که در یک بازه زمانی چه تعداد درخواست مجاز هست که به سمت برنامه بیاد.

مثلاً یک فرم داریم و کاربر باید بتونه توی 1 دقیقه فقط ۱۰ بار این فرم رو ثبت کنه و اگه بیشتر از ۱۰ بار شد، باید با خطای HTTP 429 (Too Many Requests) مواجه بشه. یعنی تعداد بیشتر از حد درخواست توی یک بازه زمانی.

لاراول برای این کار یک میدل‌ور دورنی داره به اسم Throttle داره که با تنظیم کردن اون روی روت‌ها می‌تونیم از این قابلیت استفاده کنیم:

Route::post('login', '...')->middleware('throttle:20,1');

قسمت throttle:20,1 یعنی کاربر توی 1 دقیقه مجاز هست 20 درخواست به مسیر مشخص شده بفرسته. درخواست بیشتر از مقدار تعیین شده بررسی نمیشه و با کد 429 بلاک میشه.

 

18. روت‌های Named چه کاربردی دارن؟

روت Named به روتی گفته میشه که یک اسم خاص به اون نسبت داده شده. نام‌گذاری روت‌ها برای زمانی خوبه که یک آدرس خیلی طولانی داریم و نوشتن و به یاد آوردن اون کار سختی هست و یا همچنین آدرسی که بعداً ممکنه عوض بشه.

با متد ->name() می‌تونیم یک روت Named بسازیم:

Route::get('/posts/laravel-routing-101/nz7eX', '...')->name('post');

و از اون بصورت زیر تو هر جایی از برنامه استفاده کنیم:

<form action="{{ route('post') }}"></form>
echo route('post'); // ditty.ir/posts/laravel-routing-101/nz7eX

اگه مسیر روت عوض بشه دیگه لازم نیست توی جاهایی از برنامه که داریم از این روت استفاده می‌کنیم این تغییرات رو اعمال کنیم.

برای آشنایی بیشتر با این روت‌ها می‌تونین این پست رو ببینین.

 

19. روت‌های Resource چه کاربردی دارن؟

مهمترین کاربرد این روت‌ها، خلاصه و کم حجم کردن روت‌های هست که تعریف کردیم. فرض کنیم روت‌هایی داریم بصورت زیر:

Route::get('books', 'BookController@index');
Route::get('books/{book}', 'BookController@show');
Route::post('books', 'BookController@create');
Route::patch('books/{book}', 'BookController@update');
Route::delete('books/{book}', 'BookController@destroy');

همونطور که می‌بینیم، خیلی چیزها داره تکرار میشه. مثل اسم کنترلر و پیشوند books. تفاوت فقط توی نوع روت‌ها و متد ارسال درخواست هست. این روت برای موجودیتی مثل Book نوشته شده و وقتی برای موجودیت‌ها مختلف مثلا Users هم بخوایم این کدها رو تکرار کنیم، با حجم زیادی از کد مواجه می‌شیم. فریم‌ورک یک قابلیت در اختیار ما قرار داده که بتونیم همه‌ی این روت‌ها رو تبدیل کنیم به یک روت:

Route::resource('books', 'BookController');

روت بالا خلاصه شده روت‌های بالا هست 👌

برای آشنایی بیشتر با این روت‌ها این پست اختصاصی رو بخونید.

 

20. Service Container چیه؟

یکی از مهمترین پایه‌ها و نقات قوت لاراول Service Container هست به معنی یک مخزن یا یک مکان برای نگهداری سرویس (کلاس) های مورد نیاز برنامه‌ی ما. یا به بیان فنی‌تر، یک ابزار برای مدیریت و تزریق وابستگی‌ها (Dependency Injection) توی برنامه هست.

این ویژگی برای مدیریت بهتر و جامع‌تر کلاس‌ها و نمونه‌هایی که از اونها ساخته میشن استفاده میشه و استفاده از اون انسجام برنامه بالاتر میره. سرویس‌هایی مثل Cache و Session و DB توی این مخزن نگهداری میشن.

برای درک این ویژگی پیشنهاد می‌کنم این پست اختصاصی رو بخونین.

 

خب دوستان این قسمت هم به پایان رسید 😉🖐️

از منابعی که برای این پست کمک گرفتم: