چرخه کار ریکوئست‌ها

مجتبی پاکزاد لاراول 5.6.29 در حال تکمیل رایگان

مقدمه

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

هدف از این پست، ارائه یک دیدکلی خوب و سطح بالا از نحوه کار فریمورک لاراول است. با بیشتر آشنا شدن با کلیات فریمورک، بخش‌های مختلف فریمورک کمتر جادویی به نظر می‌رسند، در نتیجه در هنگام ساخت اپلیکیشن‌های خود، اعتماد به نفس بیشتری خواهید داشت. اگر در حال حاضر، با تمامی این اصطلاحات آشنایی ندارید، نگران نباشید! تنها سعی کنید نسبت به آنچه در حال رخ دادن است، به یک درک اولیه برسید و همانطور که بخش‌های دیگر داکیومنت را مطالعه می‌کنید، دانش شما نیز افزایش پیدا خواهد کرد.

مروری بر چرخه کار

اولین چیزها

نقطه ورود تمام ریکوئست‌ها به هر اپلیکیشن لاراولی، فایل public/index.php است. با توجه به کانفیگ وب‌سرورتان (آپاچی / Nginx)، تمامی ریکوئست‌ها به این فایل هدایت می‌شوند. فایل index.php حاوی کد زیادی نیست. بلکه، نقطه شروعی برای لود مابقی فریمورک است.

فایل index.php، اتولودر (autoloader) تولید شده توسط کامپوزر را لود می‌کند و سپس یک instance از اپلیکیشن لاراولی را از اسکریپت bootstrap/app.php دریافت می‌کند. اولین عملی که توسط خود لاراول انجام می‌شود، ساخت یک instance از اپلیکیشن / سرویس کانتینر است.

کرنل‌های Console و HTTP

در مرحله بعد، بسته به نوع ریکوئست ورودی به اپلیکیشن، ریکوئست ورودی به کرنل HTTP یا کرنل console ارسال می‌شود. این دو کرنل به عنوان مکان مرکزی به کار می‌روند که تمام ریکوئست‌ها از آن‌ها عبور می‌کنند. بیابید فعلا تنها بر روی کرنل HTTP که در app/Http/Kernel.php قرار دارد، تمرکز کنیم.

کرنل HTTP کلاس Illuminate\Foundation\Http\Kernel را توسعه می‌دهد که این کلاس یک آرایه از بوت‌استرپرهایی (bootstrappers) را تعریف می‌کند که قبل از اجرای ریکوئست، اجرا خواهند شد. این بوت‌استرپرها، کنترل خطا (error handling) را پیکربندی می‌کنند، گزارش‌گیری (logging) را پیکربندی می‌کنند،محیط اجرای اپلیکیشن را شناسایی می‌کنند و سایر تسک‌هایی را که قبل از اینکه رکوئست عملا هندل شود باید انجام شده باشند را اجرا می‌کند.

همچنین کرنل HTTP لیستی از میدلور HTTP را تعریف می‌کند که تمامی ریکوئست‌ها قبل از هندل شدن توسط اپلیکیشن، باید از آن‌ها عبور کنند. این میدلور خواندن و نوشتن سشن HTTP را هندل می‌کنند، توکن CSRF را وریفای می‌کنند، مشخص می‌کنند که آیا اپلیکیشن در حالت maintenance قرار دارد یا خیر و برخی موارد دیگر.

سیگنچرِ متد handle کلاس kernel خیلی ساده است: یک Request دریافت می‌کند و یک Response برمی‌گرداند. Kernel را به شکل یک باکس سیاه بزرگ در نظر بگیرید که کل اپلیکیشن‌تان را نشان می‌دهد. اگر به این جعبه ریکوئست تحویل دهید، ریسپانس HTTP تحویل خواهید گرفت.

اصطلاحات فنی

سیگنچرِ متد (method signature)، نام متد، پارامترها و نوع آن‌ها است. برای مثال در متد زیر، handle($request) سیگنچرِ متد handle است:

/**
     * Handle an incoming HTTP request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function handle($request)
    {
        try {
            $request->enableHttpMethodParameterOverride();

            $response = $this->sendRequestThroughRouter($request);
        } catch (Exception $e) {
            $this->reportException($e);

            $response = $this->renderException($request, $e);
        } catch (Throwable $e) {
            $this->reportException($e = new FatalThrowableError($e));

            $response = $this->renderException($request, $e);
        }

        $this->app['events']->dispatch(
            new Events\RequestHandled($request, $response)
        );

        return $response;
    }

سرویس پرووایدرها (Service Providers)

یکی از مهمترین اقدامات در راه‌اندازی کرنل، لود کردن سرویس پرووایدرهای اپلیکیشن شماست. تمامی سرویس پرووایدرهای اپلیکیشن‌تان در آرایه providers فایل config/app.php پیکربندی می‌شوند. ابتدا، متد register تمامی پرووایدرها فراخوانی می‌شود، سپس، هنگامی که تمامی پرووایدرها رجیستر شدند، متد boot فراخوانی خواهد شد.

سرویس پرووایدرها، مسئول راه‌اندازی تمامی کامپوننت‌های مختلف فریمورک، از قبیل کامپوننت‌های دیتابیس، کیو، ولیدیشن و روتینگ هستند. از آنجایی که تمامی فیچرهای پیشنهاد شده توسط فریمورک، توسط سرویس پرووایدرها راه‌اندازی و کانفیگ می‌شوند، سرویس پرووایدرها مهمترین بخش از فرآیند راه‌اندازی (bootstrap) لاراول هستند.

دیسپچ ریکوئست (Dispatch Request)

هنگامی که اپلیکیشن راه‌اندازی شد و تمام سرویس پرووایدرها رجیستر شدند، Request، جهت دیسپچینگ به روتر تحویل داده می‌شود. روتر ریکوئست را به یک روت یا کنترلر دیسپچ کرده و تمامی میدلورهای مربوط به روت را نیز اجرا می‌کند.

تمرکز بر سرویس پرووایدرها

سرویس پرووایدرها در حقیقت کلید راه‌اندازی یک اپلیکیشن لاراولی هستند. instance اپلیکیشن ایجاد می‌شود، سرویس پروایدرها رجیستر می‌شوند و ریکوئست به اپلیکیشن که در این لحظه راه‌اندازی شده، تحویل داده می‌شود. فرآیند خیلی ساده‌ای است.

داشتن درکی درست از نحوه ساخت و راه اندازی اپلیکیشن‌های لاراولی توسط سرویس پرووایدرها بسیار ارزشمند است. طبیعتا، سرویس پرووایدر پیش‌فرض اپلیکیشن‌تان در دایرکتوری app/Providers قرار دارد.

به صورت پیش‌فرض، متدهای AppServiceProvider فاقد کدی در بدنه خود هستند. این پرووایدر محل خوبی برای افزودن سرویس کانتینر بایندینگ‌ها و بوتسترپینگ مربوط به خود اپلیکیشن‌تان هستند. طبیعتا، برای اپلیکیشن‌های بزرگ، ممکن است بخواهید سرویس پرووایدرهای مختلفی ایجاد کنید و هر کدام با جزئیات بیشتری از بوت‌استرپینگ.