برنامه نویسی 382 بازدید

در این مقاله، به بررسی عمیق‌تر فریمورک لاراول می‌پردازیم تا با مفهوم «میان‌افزار» (middleware) در آن آشنا شویم. نیمه نخست این مقاله اختصاص به معرفی یک میان افزار لاراول دارد و کاربرد عملی آن را توضیح می‌دهد. در ادامه به توضیح شیوه ایجاد میان‌افزار سفارشی در اپلیکیشن لاراول می‌پردازیم. پس از ایجاد میان‌افزار سفارشی به بررسی گزینه‌های موجود برای ثبت نام آن در لاراول می‌پردازیم به طوری که بتواند در عمل در طی گردش پردازش درخواست فراخوانی شود.

برای مطالعه این مقاله شما باید با برخی مفاهیم مقدماتی لاراول و ابزار خط فرمان «آرتیزان» (Artisan) برای تولید کد چارچوب آشنا باشید. البته نصب آخرین نسخه از اپلیکیشن لاراول نیز به شما کمک می‌کند که بتوانید مثال ارائه شده در این مقاله را به روشی سرراست اجرا کنید.

منظور از میان‌افزار در لاراول چیست؟

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

بنابراین شاید بپرسید منظور از قلاب کردن به گردش پردازش درخواست لاراول چیست؟ برای پاسخ به این سؤال باید چیزی را تصور کنید که در مراحل نخست بوت‌استرپ کردن یک اپلیکیشن باید اجرا شود. برای نمونه برای احراز هویت کاربر در مراحل نخست باید تصمیم‌گیری شود که آیا به مسیر کنونی اجازه دسترسی دارند یا نه.

چند موضوع وجود دارند که با استفاده از میان‌افزار می‌توان به دست آورد:

  • لاگ کردن درخواست‌ها
  • باز هدایت کاربران
  • تغییر دادن/پاک‌سازی پارامترهای ورودی
  • دست‌کاری پاسخ دریافتی از سوی اپلیکیشن لاراول
  • و موارد دیگر.

در واقع، اپلیکیشن پیش‌فرض لاراول از قبل به همراه چند میان‌افزار مهم عرضه می‌شود. برای نمونه یک میان‌افزار وجود دارد که بررسی می‌کند آیا در حالت «نگهداری» (maintenance) است یا نه. از سوی دیگر، میان‌افزاری برای پاک‌سازی پارامترهای درخواست ورودی وجود دارد. چنان که پیش‌تر اشاره کردیم، احراز هویت کاربر نیز به وسیله خود میان‌افزار به دست می‌آید.

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

ایجاد میان‌افزار سفارشی

در این بخش یک میان‌افزار سفارشی می‌سازیم. اما شاید بپرسید میان‌افزار سفارشی قرار است دقیقاً چه کاری را انجام دهد؟

شاید تاکنون با این موقعیت مواجه شده باشید که از شما خواسته شود در صورتی که کاربران از هر نوع دستگاه موبایل به وب‌سایتی دسترسی پیدا کنند، بدون ایجاد هیچ گونه تغییر در هیچ کدام از پارامترهای رشته کوئری به URL زیردامنه متناظر موبایل هدایت شوند. این حالت می‌تواند یک مثال کاربردی خوبی برای نمایش شیوه استفاده از میان‌افزار در سناریوهای خاص باشد.

دلیل این که چرا باید بخواهیم از میان‌افزار استفاده کنیم، نیاز به ارائه قلابی روی گردش درخواست اپلیکیشن است. در این میان‌افزار سفارشی که می‌خواهیم بسازیم، به بررسی user agent می‌پردازیم و در صورتی که کاربران از یک دستگاه موبایل به سایت مراجعه کرده باشند، آن‌ها را به URL متناظری ارسال می‌کنیم.

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

php artisan make:middleware MobileRedirect

و بدین ترتیب فایلی به نام app/Http/Middleware/MobileRedirect.php با کد زیر ایجاد می‌شود:

<?php
  
namespace App\Http\Middleware;
  
use Closure;
  
class MobileRedirect
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

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

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

در ادامه فایل app/Http/Middleware/MobileRedirect.php را به صورت زیر تغییر می‌دهیم:

<?php
  
namespace App\Http\Middleware;
  
use Closure;
  
class MobileRedirect
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // check if the request is from mobile device
        if ($request->mobile == "1") {
            return redirect('mobile-site-url-goes-here');
        }
  
        return $next($request);
    }
}

به منظور ساده‌سازی به بررسی وجود پارامتر رشته کوئری mobile می‌پردازیم و اگر TRUE تعیین شده باشد، کاربر به URL سایت موبایل متناظر باز هدایت می‌شود. البته باید از کتابخانه تشخیص user agent استفاده کنیم که در عمل نیز مورد استفاده قرار خواهیم داد. ضمناً باید مسیر mobile-site-url-goes-here را با مسیر مناسب URL جایگزین کنیم، چون تنها یک placeholder برای مقاصد آموزشی ما محسوب می‌شود.

ما با پیگیری همین منطق سفارشی‌مان یک فراخوانی به (next($request$ ارسال می‌کنیم که امکان پردازش بیشتر درخواست را در زنجیره اپلیکیشن فراهم می‌سازد. نکته مهم برای اشاره در این مثال آن است که منطق تشخص موبایل را پیش از فراخوانی (next($request$ قرار داده‌ایم که عملاً آن را پیش از میان‌افزار قرار می‌دهد. بدین ترتیب میان‌افزار سفارشی ما تقریباً آماده تست شده است. در این لحظه، هیچ راهی وجود ندارد که لاراول در مورد میان‌افزار ما اطلاعی داشته باشد. برای اتفاق افتادن این موضوع، باید میان‌افزار را در اپلیکیشن لاراول ثبت کنیم و این دقیقاً موضوع بخش بعدی این راهنما است.

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

<?php
  
namespace App\Http\Middleware;
  
use Closure;
  
class CustomMiddleWare
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
         
        /* your custom logic goes here */
         
        return $response;
    }
}

احتمالاً چنان که هم اینک متوجه شده‌اید، منطق سفارشی میان‌افزار پس از این که درخواست از سوی اپلیکیشن لاراول پردازش‌شده اجرا می‌شود. این بار، به شیء response$ نیز دسترسی داریم که امکان دست‌کاری جنبه‌های خاص آن را می‌دهد. بنابراین داستان پس از میان‌افزار چنین است.

میان‌افزار سفارشی در عمل

این بخش فرایند ثبت میان‌افزار را در اپلیکیشن لاراول توضیح می‌دهد، به طوری که می‌تواند در عمل در طی گردش پردازش درخواست اجرا شود. در ادامه فایل app/Http/Kernel.php را باز کنید و به دنبال قطعه کد زیر بگردید:

/**
 * The application's global HTTP middleware stack.
 *
 * These middleware are run during every request to your application.
 *
 * @var array
 */
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

چنان که می‌بینید middleware$ آرایه میان‌افزار را نگهداری می‌کند که به همراه نصب پیش‌فرض لاراول عرضه می‌شود. میان‌افزار لیست شده در این بخش به محض دریافت هر درخواست لاراول اجرا می‌شود و از این رو کاندیدای ایده‌آلی برای قرار دادن میان‌افزار سفارشی ما محسوب می‌شود. در ادامه کد میان‌افزار سفارشی ما را چنان که در قطعه کد زیر می‌بینید درج کنید:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\MobileRedirect::class,
];

اکنون تلاش کنید به هر کدام از مسیرهای لاراول با استفاده از رشته کوئری mobile=1 دسترسی پیدا کنید تا کد میان‌افزارمان اجرا شود. بدین ترتیب با روش ثبت میان‌افزاری که قرار است در هر درخواست اجرا شود آشنا شدید. با این حال پاره‌ای اوقات باید میان‌افزار را صرفاً برای مسیرهای خاصی اجرا کنید. در ادامه به بررسی شیوه دستیابی به این وضعیت با استفاده از routeMiddleware$ می‌پردازیم.

در چارچوب نمونه جاری، تصور می‌کنیم که کاربران در صورتی که به مسیر خاصی در سایت دسترسی پیدا کنند به نسخه موبایل دسترسی پیدا می‌کنند. در این سناریو، لازم نیست میان‌افزار را در لیست middleware$ بگنجانیم. به جای آن می‌توانید میان‌افزار را مستقیماً چنان که در ادامه می‌بینید به تعریف مسیر الصاق کنیم:

Route::get('/hello-world', 'HelloWorldController@index')->middleware(\App\Http\Middleware\MobileRedirect::class);

در واقع، ما می‌توانیم یک مرحله جلوتر برویم و یک نام مستعار برای میان‌افزار خود ایجاد کنیم، به طوری که لازم نباشد از نام‌های کلاس درون‌خطی استفاده کنید. فایل app/Http/Kernel.php را باز کنید و به دنبال عبارت routeMiddleware$ بگردید که نگاشت‌های اسامی مستعار به میان‌افزار را نگهداری می‌کند. در ادامه مدخل خود را چنان که در کد زیر می‌بینید درون آن لیست می‌گنجانیم.

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'mobile.redirect' => \App\Http\Middleware\MobileRedirect::class
];

و تعریف مسیر بازبینی‌شده به صورت زیر به نظر می‌رسد:

Route::get('/hello-world', 'HelloWorldController@index')->middleware('mobile.redirect');

این روش ثبت میان‌افزار در اپلیکیشن لاراول است که چنان که دیدید کاملاً سرراست محسوب می‌شود. بدین ترتیب به انتهای این مقاله می‌رسیم.

سخن پایانی

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

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

مطبی که در بالا مطالعه کردید بخشی از مجموعه مطالب «آموزش لاراول» است. در ادامه، می‌توانید فهرست این مطالب را ببینید:

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

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

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *