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

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

مقدمه

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

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

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

اولین چیزها

نقطه ورود تمام ریکوئست‌ها به هر اپلیکیشن لاراولی، فایل 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 فاقد کدی در بدنه خود هستند. این پرووایدر محل خوبی برای افزودن سرویس کانتینر بایندینگ‌ها و بوتسترپینگ مربوط به خود اپلیکیشن‌تان هستند. طبیعتا، برای اپلیکیشن‌های بزرگ، ممکن است بخواهید سرویس پرووایدرهای مختلفی ایجاد کنید و هر کدام با جزئیات بیشتری از بوت‌استرپینگ.


سایر پست‌های داکیومنت

  • پیش‌گفتار
    • Release Notes ترجمه در ورژن‌های بعدی
    • راهنمای آپگرید ترجمه در ورژن‌های بعدی
    • Contribution Guide ترجمه در ورژن‌های بعدی
  • شروع
    • نصب
    • پیکربندی
    • ساختار دایرکتوری ترجمه در ورژن‌های بعدی
    • Laravel Homestead ترجمه در ورژن‌های بعدی
    • Laravel Valet ترجمه در ورژن‌های بعدی
    • دپلویمنت ترجمه در ورژن‌های بعدی
  • مفاهیم معماری
  • اصول اولیه
  • فرانت‌اند
  • امنیت
    • Authentication ترجمه در ورژن‌های بعدی
    • API Authentication (Passport) ترجمه در ورژن‌های بعدی
    • Authorization ترجمه در ورژن‌های بعدی
    • Encryption ترجمه در ورژن‌های بعدی
    • Hashing ترجمه در ورژن‌های بعدی
    • Resetting Passwords ترجمه در ورژن‌های بعدی
  • مباحث عمیق‌تر
    • Artisan Console ترجمه در ورژن‌های بعدی
    • Broadcasting ترجمه در ورژن‌های بعدی
    • Cache ترجمه در ورژن‌های بعدی
    • Collections ترجمه در ورژن‌های بعدی
    • Events ترجمه در ورژن‌های بعدی
    • File Storage ترجمه در ورژن‌های بعدی
    • Helpers ترجمه در ورژن‌های بعدی
    • Mail ترجمه در ورژن‌های بعدی
    • Notifications ترجمه در ورژن‌های بعدی
    • Package Development ترجمه در ورژن‌های بعدی
    • Queues ترجمه در ورژن‌های بعدی
    • Task Scheduling ترجمه در ورژن‌های بعدی
  • دیتابیس
  • Eloquent ORM
    • Eloquent: Getting Started ترجمه در ورژن‌های بعدی
    • Eloquent: Relationships ترجمه در ورژن‌های بعدی
    • Eloquent: Collections ترجمه در ورژن‌های بعدی
    • Eloquent: Mutators ترجمه در ورژن‌های بعدی
    • Eloquent: API Resources ترجمه در ورژن‌های بعدی
    • Eloquent: Serialization ترجمه در ورژن‌های بعدی
  • Testing
    • Testing: Getting Started ترجمه در ورژن‌های بعدی
    • HTTP Tests ترجمه در ورژن‌های بعدی
    • Browser Tests (Laravel Dusk) ترجمه در ورژن‌های بعدی
    • Database Testing ترجمه در ورژن‌های بعدی
    • Mocking ترجمه در ورژن‌های بعدی
  • Official Packages
    • Laravel Cashier ترجمه در ورژن‌های بعدی
    • Envoy Task Runner ترجمه در ورژن‌های بعدی
    • Laravel Horizon ترجمه در ورژن‌های بعدی
    • API Authentication (Passport) ترجمه در ورژن‌های بعدی
    • Laravel Scout ترجمه در ورژن‌های بعدی
    • Laravel Socialite ترجمه در ورژن‌های بعدی