11 آذر 1398 ساعت 08:27

میان افزار چیست؟ - آموزش ایجاد یک میان افزار (middleware) در لاراول

میان افزار یا Middleware d یک مکانیسم هست که در خواست های Http که به سمت اپلیکیشن شما میاد رو فیلتر می کنه.همونطور که گفتم لاراول میان افزار های متعددی بصورت پیش فرض داره که کارهای خاص خودشون رو انجام می دن که در ادامه به برخی از اونها نیز اشاره خواهیم کرد، اما ما خودمون به راحتی هم می تونیم میان افزار (middleware) مورد نظر خودمون رو بسازیم.

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

اما میان افزار یا Middleware چیست؟

میان افزار یا Middleware d یک مکانیسم هست که در خواست های Http که به سمت اپلیکیشن شما میاد رو فیلتر می کنه. برای نمونه وقتی یک کاربر لاگین می کنه و قصد ورود به صفحه پروفایل رو داره، لاراول با یک میان افزار بررسی میکنه و اگر اون کاربر قابلیت دسترسی به صفحه مورد نظر رو داشت بهش اجازه می ده صفحه رو ببینه در غیر این صورت اونو به صفحه لاگین ارجاع می دهد.

پس به زبان ساده کار یک میان افزار اینه که درخواست های Http که به سمت اپلیکیشن میاد رو فیلتر و بررسی می کنه و عملیات های مورد نظر رو بسته به کارکردی که براش مشخص شده اجرا خواهد کرد.

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

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

اگر لاراول رو نصب ندارید ابتدا اون رو با استفاده از دستور زیر نصب کنید:

composer create-project laravel/laravel LaravelMiddleware

 

پس از نصب لاراول ما می تونیم کار خودمون رو شروع کنیم. 

برای ساخت یک middleware شما در لاراول کار زیادی نمی خواد انجام بدین، تنها کافیست دستور زیر را در خط فرمان اپلیکیشن خود اجرا نمایید:

php artisan make:middleware CheckType

پس از اجرای دستور بالا یک فایل در دایرکتوری App\Http\Middleware ایجاد خواهد شد که حاوی کدهایی مشابه کدهای زیر خواهد بود:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckType
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

 

البته شما بصورت دستی نیز می تونید این فایل رو ایجاد و سپس تابع handle رو تو اون ایجاد کنید.

فایل ایجاد شده رو بصورت زیر تغییر دهید:

<?php


namespace App\Http\Middleware;


use Closure;


class CheckType
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->type != 2) {
            return response()->json('Please enter valid type');
        }


        return $next($request);
    }
}

 

همونطور که می بینید ما مقدار type را بررسی کرده ایم، اگر این مقدار مخالف ۲ باشد کاربر با پیغام خطایی مواجه خواهد شد و در غیر اینصورت کاربر می تواند صفحه مورد نظر را مشاهده کند.

حالا باید کلاس میان افزار ایجاد شده ی خودمون رو به لاراول بشناسونیم و بهش بگیم که این کلاس وجود داره و باید در جاهایی که ما اونو صدا می زنیم لاراول برامون اجراش کنه و نتیجه رو برگردونه. 

برای معرفی یک میان افزار باید میان افزار خودتون رو در فایل kernel.php معرفی یا register کنید. برای اینکار فایل app/Http/Kernel.php رو باز کنید و کد زیر رو در متغییر $routeMiddleware قرار دهید:

 protected $routeMiddleware = [
        ....
        'checkType' => \App\Http\Middleware\CheckType::class,
    ];

 

حالا میان افزار ما قابل استفاده هست و میتونیم اون رو در روت های مورد نظرمون خودمون با نام checkType صدا بزنیم. 

برای صدا زدن میان افزاری که ایجاد کردیم فایل routes/web.php رو باز کنید و کد زیر رو در اون قرار بدین:

Route::get("check-md",["uses"=>"HomeController@checkMD","middleware"=>"checkType"]);

 

ما به لاراول گفتیم که هر زمان یک کاربر از شما درخواست صفحه /check-md رو کرد شما با استفاده از میان افزار checkTtpe شرایط دسترسی رو بررسی کنید. همونطور که از کد بالا متوجه شدید برای افزودن یک میان افزار به روت ابتدا عبارت middleware و سپس نام آن را (که در اینجا checkType می باشد را) صدا خواهیم زد.

البته شما می توانید به روش زیر نیز به روت های خودتون middleware اختصاص بدین

Route::get('/', function () {
    //
})->middleware('first', 'second');

 

همچنین شما اگه قصد دارید چند middleware به روت خاصی اضاف کنید بصورت زیر می تونید اینکار رو انجام بدین:

['middleware' => ['first', 'second']

 

همونطور که دیدین ما به لاراول گفتیم که اگر کاربری روت check-md رو صدا زد میان افزار ckeckType باید کار فیلتر رو برای ما انجام بده و یکسری کار ( که ایجا همون بررسی مقدار type) هست رو بررسی کنه.

 برای مشاهده نتیجه میان افزار ساخته شده فایل app/Http/Controllers/HomeController.php رو باز (یا ایجاد) کنید و اون رو بصورت زیر تغییر بدین:

<?php


namespace App\Http\Controllers;


use Illuminate\Http\Request;


class HomeController extends Controller
{
    public function checkMD()
    {
    	dd('checkMD');
    }
}

 

حالا اپلیکیشن خود را سرو کنید و سپس آدرس های زیر را فراخوانی کنید

http://localhost:8000/check-md?type=2

http://localhost:8000/check-md?type=1

 

همونطور که دیدین اگر پارامتر type برابر ۲ نباشد پیغام خطایی که مشخص کرده ایم برای کاربر نمایش داده خواهد شد و اگر برابر ۲ باشد، لاراول اجاره ادامه فرایند را خواهد داد و شما بیا عبارت درون تابع checkMD در کنترلر مواجه خواهید شد.

 

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

یکی از منابع کامل برای معرفی دیگر قابلیت های میان افزار های صفحه رسمی لاراول به آدرس https://laravel.com/docs/6.x/middleware می باشد.

 

امیدوارم این آموزش برای شما مفید بوده باشه و تونسته باشم رضایت شما رو جلب کنم و کمی به  یادگیری شما کمک کنم :)

 

در صورتی که سوالی دارید یا پیشنهادی دارید از بخش نظرات ارسال کنید

35 admin
نظرات

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

پاسخ به نظر
اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!

هنوز برای این مطلب نظری ارسال نشده است!
0