Middleware
میان افزار یا Middleware یک مفهوم در مهندسی نرم افزار است. در نرم افزار های لاراول Middleware ها قبل از این که درخواست به controller برود اجرا می شوند تا اغلب بررسی هایی روی خود درخواست و درخواست دهنده پیاده سازی کنند.
middleware ها مکانیزمی برای فیلتر کردن HTTP requests می باشند. پس به صورت شماتیک می توانیم middleware را لایه ای قبل از controller در نظر بگیریم.
نمونه اول از Middleware ها می توان به Form Validation ها اشاره کرد که مثلا قبل از این که اطلاعات فرم در پایگاه داده ذخیره گردد فیلد های درخواست از نظر نوع محتوا valid می شدند.
میان افزار های پیش فرض – Default Middlewares
middleware های زیادی در لاراول به صورت پیش فرض وجود دارد و همچنین شما هم می توانید middleware جدید با هدف فیلتری خاص به اپلیکیشن اضافه کنید. تمامی middleware های نامبرده در مسیر app/Http/Middleware
موجود می باشند.
اگر به فایل kernel واقع در مسیر app/Http/kernel.php
بروید می توانید لیست میان افزار ها را در آنجا مشاهده کنید.
میان افزار ها با Middlewares در لاراول شامل :
- middleware : این ها میان افزار هایی هستند که مادامی که فعال باشند روی همه درخواست ها اجرا می شوند.
- middlewareGroups : این دسته از میان افزارها به route ها تعلق می گیرد. یعنی یک نام middleware تعیین می کنید و تعدادی middleware با به آن تخصیص می دهید. مثلا middleware با نام web حاوی تعداد زیادی کلاس middleware می باشد.
- routeMiddleware : این میان افزارها در controller ها قابل استفاده است. هر middleware تعیین شده به یک کلاس خاص.
هر کلاس مربوط به middleware را می توان در مسیرapp/Http/middlewares
پیدا کنید. در صورتی که جدول route:list را مشاهده کنید خواهید دید که هر دسته به چه route هایی تعلق گرفته است.
middleware
- CheckForMaintenanceMode : بررسی می کند که نرم افزار ما در چه Mode است ⇐ down یا up
- ValidatePostSize : اندازه درخواست post که فرستاده معتبر است یا خیر.
- TrimStrings : فاصله (space) را از مقادیری که در فیلد های post ارسال کرده اید حذف می کند. با مراجعه به
app/Http/middleware/TrimStrings.php
و با افزودن نام فیلد مورد نظر بهprotected $except
آن را از فیلتر این میان افزار استثنا می کنیم. - ConvertEmptyStringsToNull : فیلد هایی با مقدار empty را به null تبدیل می کند. تکنیک خوبی است تا راحت تر از تابع
isset
استفاده کنیم. - TrustProxies : فیلتر مربوط به محدودیت تعداد درخواست یا همان جلوگیری از حملات Brute Force Attack .
هر یک از میان افزارهای بالا در فایل kernel.php قابل غیر فعال شدن است.
middlewareGroups
با استفاده از دستور route:list
می توانیم لیست route ها را با همراه اطلاعات آن ها مشاهده کنید. در فیلد Middleware می توان لیست middlewareGroups که به هر route تخصیص داده شده است را ببینیم.
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | | GET|HEAD | / | home | Closure | web | | | GET|HEAD | about-us/{author?} | about.us | App\Http\Controllers\aboutPage@index | web | | | POST | admin | save.product | App\Http\Controllers\ProductController@saveProduct | web,auth | | | GET|HEAD | admin | dashboard | App\Http\Controllers\ProductController@dashboard | web,auth | | | GET|HEAD | admin/new-product | new.product | App\Http\Controllers\ProductController@newProduct | web,auth | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|HEAD | getsession | | Closure | web | | | GET|HEAD | home | | App\Http\Controllers\HomeController@index | web,auth | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest | | | POST | password/reset | password.update | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest | | | GET|HEAD | product/{id} | | App\Http\Controllers\ProductController@single | web | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | | | GET|HEAD | setsession | | Closure | web | | | GET|HEAD | shop | product.list | App\Http\Controllers\ProductController@archive | web | +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
همان طور که می بینید میان افزار web برای اکثریت route ها فعال می باشد و یکی از کاربردهای این دسته middleware اعتبارسنجی از طریق فیلد csrf_token می باشد.
میان افزار auth برای route ها و method هایی فعال است که بوسیله میان افزار auth یا guest محافظت شده باشند. (مبحث Protecting Routes از درس Authentication)
routeMiddleware
این میان افزار ها در controller ها با استفاده از method با نام middleware
قابل دسترسی است. نمونه ای از این میان افزار را با نام های auth و guest در مبحث Authentication مشاهده کرده ایم.
<?php public function __construct(){ //$this->middleware('guest')->only(['archive','single']); }
در مثال بالا از middleware با نام guest از routeMiddleware ها استفاده کردیم.
این میان افزار ها به صورت مستقیم به route می تواند لینک گردد:
<?php Route::get('admin/new-product/','ProductController@newProduct')->name('new.product')->middleware('auth');
ساخت میان افزار – Create Middleware
ما نیز می توانیم middleware شخصی خودمان را بسازیم. به این ترتیب برای ساخت middleware چهار گام را باید طی کنید. به طور مثال ما یک middleware با نام verifyAge می سازیم که مثلا برای route مسافرت ('/travel'
) اگر سن (پارامتر age) کم تر از 18 سال بود خطا به کاربر نمایش دهد.
گام نخست ) ساخت middleware با استفاده از دستور زیر
php artisan make:middleware verifyAge
بعد از اجرای دستور بالا یک فایل در مسیر app\Http\Middleware\VerifyAge.php
ساخته می شود. درون آن یک متد با نام handle موجود است که ما باید قوانین را در آن پیاده سازی کنیم.
گام دوم ) اجرای قوانین middleware با استفاده از متد handle از کلاس middleware
public function handle($request, Closure $next) { if($request->age < 18){ return response()->json(['error'=>'Under 18 years old']); } return $next($request); }
در کد بالا اگر سن کم تر از 18 باشد خطا نمایش داده می شود و در غیر اینصورت ادامه کار return $next($request)
انجام میشود که می تواند اجرای متد کنترلر یا clusoure باشد یا اعمال middleware بعدی.
گام سوم ) اضافه کردن middleware به kernel
protected $routeMiddleware = [ ... 'verify.age' => \App\Http\Middleware\VerifyAge::class, ];
با توجه به نیاز خودمان باید middleware را به مکان مورد نظر خود اضافه کنیم. مثلا می توانیم آن را به $middleware
اضافه کنیم که روی تمامی درخواست ها اعمال گردد . یا می توان آن را به web middlewareGroups اضافه کنیم یا مثل کد بالا آن را با نام verify.age به $routeMiddleware
اضافه کنیم. با توجه به کد بالا ما routeMiddleware ساختیم.
گام چهارم ) استفاده از middleware در route یا controller
Route::get('/travel/{age}',function(int $age){ return "Travelling in age $age"; })->middleware("verify.age");
همان طور که در قسمت routeMiddleware گفتیم می توانیم custom middleware خومان را روی درخواست ها اعمال کنیم.
دیدگاهتان را بنویسید