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

 

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

  1. Maintenance Mode چیه؟
  2. Queue چه کاربردی داره؟
  3. Seeder چیه؟
  4. گزینه --pretend هنگام اجرای Migration چکار می‌کنه؟
  5. تفاوت متد firstOrCreate با firstOrNew الوکوئنت چیه؟
  6. باگ کد زیر چیه؟
  7. Application Key چه کاربردی داره؟
  8. Single Action Controller چیه؟
  9. Gate چیه؟
  10. دستور bail توی Validation چکار می‌کنه؟

 

41. Maintenance Mode چیه؟

وقتی می‌خوایم تغییراتی توی برنامه ایجاد کنیم و لازمه حین اجرای تغییرات، برنامه از دسترس خارج باشه، از حالت Maintenance Mode استفاده می‌کنیم. مثلاً می‌خوایم یک باگ رو برطرف کنیم یا یک ویژگی اضافه کنیم که لازمه برنامه برای لحظاتی از دید کاربر خارج بشه.

توی لاراول این حالت با دستور آرتیزان زیر فعال میشه:

php artisan down

 با فعال شدن این حالت، همه کاربرها با پیامی مواجه میشن که میگه سایت فعلاً در دسترس نیست:

تصویر نوشته

وقتی دستور بالا اجرا میشه، یک فایل به اسم down توی مسیر storage/framework درست میشه که شامل تنظیمات این حالت هست.

برای خارج شدن از حالت Maintenance دستور آرتیزان زیر رو وارد می‌کنیم که با اجرای اون فایل down هم پاک میشه:

php artisan up

 

42. Queue چه کاربردی داره؟

فرض کنیم عملیاتی داریم که اجرای اون زمان زیادی طول می‌کشه. مثلاً ارسال ایمیل انبوه. اگه اجرای عملیاتِ زمان‌بر رو مدیریت نکنیم (مثلاً همون لحظه این عملیات رو پردازش و اجرا کنیم) علاوه بر اینکه کاربر باید مدت زیادی برای پاسخ منتظر باشه، با انباشت شدن اونها فشار زیادی به سرور وارد میشه که ممکنه باعث اختلال توی سرور و برنامه بشه. Queue یا صف، برای حل این مسئله به وجود اومده.

از صف زمانی استفاده می‌کنیم که می‌خوایم اجرای یک عملیات سنگین یا زمان‌بر رو به یک زمان دیگه موکول کنیم. صف‌ها بطور مستقل از چرخه اصلی برنامه (Request/Response) اجرا میشن تا مشکلی برای پردازش درخواست‌های دیگه به وجود نیاد. با صف‌ها می‌تونیم عملیات سنگین رو به دسته‌های کوچیک‌تر تقسیم کنیم تا فشار کمتری به سرور وارد بشه.

 

43. Seeder چیه؟

گاهی اوقات بعد از  اینکه یک جدول توی دیتابیس ساختیم، لازم داریم بلافاصله اون رو با یک سری اطلاعات پر کنیم. این اطلاعات معمولاً از پیش تعریف شده هستن (مثلاً توی یک آرایه یا یک فایل اکسل ذخیره شده) و می‌خوایم بصورت برنامه‌نویسی‌شده وارد جدول کنیم. سیدر (Seeder) ها اینجا به کار ما میان.

از سیدرها زمانی استفاده می‌کنیم که می‌خوایم یک جدول توی دیتابیس رو با اطلاعات از پیش تعریف شده پر کنیم. مثلاً اطلاعات جدول کشورها/استان‌ها/شهرها اطلاعاتی ثابت و از پیش تعریف شده هست و معمولاً بعد از اینکه جداول اونها ساخته میشه، اطلاعات از پیش تعریف‌شده باید توی جدول قرار بگیره. اگه اون اطلاعات رو داریم، می‌تونیم با سیدر اونها رو وارد جدول کنیم.

همچنین اگه جدولی داریم که می‌خوایم برای تست کردن، اون رو با اطلاعات ساختگی و غیرواقعی پر کنیم می‌تونیم از سیدر (Seeder) ها استفاده کنیم.

 

44. گزینه --pretend هنگام اجرای Migration چکار می‌کنه؟

اگه هنگام با دستور آرتیزان migrate گزینه --pretend رو مشخص کنیم:

php artisan migrate --pretend

Migrate واقعی اتفاق نمی‌افته و بجاش کد SQLـی که قراره اجرا بشه رو به خروجی می‌فرسته. این برای زمانی خوبه که می‌خوایم قبل از Migrate، کد SQLـی که قراره اجرا بشه رو بببینم.

 

45. تفاوت متد firstOrCreate با firstOrNew الوکوئنت چیه؟

این دو متد شباهت‌های زیادی به هم دارن. ابتدا با کاربرد مشترک اونها آشنا بشیم. کد زیر رو در نظر بگیرید:

$user = User::where('name', 'John')->first();

if ($user === null) {
    $user = new User;
}

$user->age = 7;
$user->email = request('email');
$user->save();

توی کد بالا می‌خوایم کاربر با اسم John رو از جدول بخونیم (خط ۱) و اگه وجود نداشت یکی با همین اسم بسازیم (خط ۴). لاراول امکانی رو در اختیار ما گذاشته که بتونیم همه این عملیات رو یک‌جا انجام بدیم. دو متد firstOrCreate و firstOrNew اینجا به کار ما میان. هر دو متد بررسی می‌کنن که آیا یک رکورد با شرایطی که تعریف می‌کنیم توی جدول وجود داره یا نه و اگه وجود نداشت، کمک می‌کنن تا اون رکورد رو بسازیم.

کد بالا رو با متد firstOrNew بصورت زیر می‌نویسیم:

$user = User::firstOrNew(['name' => 'John']);

$user->age = 7;
$user->email = request('email');
$user->save();

می‌تونیم مقدار دادن به Attribute هایی که توی خط ۳ و ۴ نوشتیم رو توی آرگومان دوم متد تعریف کنیم:

$user = User::firstOrNew(
    ['name' => 'John'],
    [
        'age' => 7
        'email' => request('email')
    ]
);

$user->save();

اینجا آرگومان اول برای بررسی شرط و آرگومان دوم برای مقدار دادن به Attribute ها برای زمانی که رکورد وجود نداشت استفاده میشه.

متد firstOrCreate کار مشابه به متد firstOrNew انجام میده. با این تفاوت که نیاز نداریم ->save() رو صدا بزنیم. چون بطور خودکار رکورد ساخته میشه. درست مثل متد ::create الوکوئنت:

$user = User::firstOrCreate(
    ['name' => 'John'],
    [
        'age' => 7
        'email' => request('email')
    ]
);

 

46. باگ کد زیر چیه؟

کد زیر یک میدل‌ور هست:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class MyMiddleware
{
    public function handle($request, Closure $next)
    {
        if ($condition) {
            return redirect('/not-available');
        }

        $next($request);
    }
}

باگ توی خط ۱۶ هست. باید بدونیم میدل‌ورها بصورت زنجیر به هم متصل هستن. یعنی هر میدل‌ور اطلاعات رو بررسی می‌کنه و بعد اون رو به میدل‌ور بعدی پاس میده. پاس دادن به میدل‌ور بعدی با return $next($request) اتفاق می‌افته. چون توی کد بالا return نوشته نشده، زنجیره میدل‌ور قطع میشه و میدل‌ورهای بعدی از دور خارج میشن.

 

47. Application Key چه کاربردی داره؟

Application Key یا همون متغیر APP_KEY توی فایل .env یک کلید به صورت رشته هست که برای رمزگذاری اطلاعات استفاده میشه. فریم‌ورک از این کلید برای رمزگذاری اطلاعاتی مثل کوکی و سشن و توکن‌های CSRF استفاده می‌کنه.

همونطور که آقای Otwell توی توئیت زیر گفته، اینکه این کلید برای هش کردن پسوردها استفاده میشه یک تصور اشتباه هست. این کلید فقط برای رمزگذاری و رمزگشایی استفاده میشه:

تصویر نوشته

این رشته باید توی جای امن مثل فایل .env نگهداری بشه و لو رفتن اون باعث آسیب‌پذیری برنامه میشه.

 

48. Single Action Controller چیه؟

به کنترلری گفته میشه که فقط یک کار انجام میده. در حالت عادی یک کنترلر شامل چندین متد برای مدیریت کردن درخواست‌های مختلف میشه. اما یک Single Action Controller فقط قراره یک درخواست رو مدیریت کنه. ساختار این کنترلرها بصورت زیر هست:

<?php

namespace App\Http\Controllers;

class BookController extends Controller
{
    public function __invoke()
    {
        // ...
    }
}

کاری که می‌خوایم انجام بدیم رو داخل متد __invoke می‌نویسیم. روت برای چنین کنترلرهایی بصورت زیر هست:

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

همونطور که می‌بینیم دیگه لازم نیست به متد اشاره کنیم و خود به خود متد __invoke در نظر گرفته میشه.

 

49. Gate چیه؟

با گِیت (Gate) می‌تونیم بررسی کنیم آیا یک کاربر مجوز انجام یک کار خاص رو داره یا نه. یک گیت که بصورت یک کلوژر هست، معمولاً با کلاس (فساد) Gate توی متد boot توی AuthServiceProvider تعریف میشه:

Gate::define('create-post', function ($user) {
    return $user->isAuthor;
});

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

if (Gate::allows('create-post')) {
    // The current user can create posts
}

 

50. دستور bail توی Validation چکار می‌کنه؟

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

$this->validate($request, [
    'username' => 'bail|required|string|max:255|exists:users'
]);

اگه اولین شرط اعتبارسنجی با خطا مواجه بشه، اعتبارسنجی برای این ورودی متوقف میشه و بقیه شرط‌ها بررسی نمیشن. مثلاً اگه اعتبارسنجی از required رد نشه، آیتم‌های بعدی مثل exists که یک کوئری به دیتابیس هست بررسی نمیشه.

 

خب دوستان این هم از قسمت پنجم. روزتون خوش 😉✌️

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