میان افزار HTTP
معرفی
میانافزار HTTP مکانیزم مناسبی برای فیلتر کردن درخواستهای HTTP که وارد برنامه شما میشوند، فراهم میکند. به عنوان مثال، لاراول شامل یک میان افزار است که تأیید می کند کاربر برنامه شما احراز هویت شده است. اگر کاربر احراز هویت نشود، میان افزار کاربر را به صفحه ورود هدایت می کند. با این حال، اگر کاربر احراز هویت شود، میانافزار به درخواست اجازه میدهد تا در برنامه ادامه یابد.
البته، میانافزار را میتوان برای انجام کارهای مختلفی علاوه بر احراز هویت، نوشت. یک میان افزار CORS ممکن است مسئول اضافه کردن هدرهای مناسب به تمام پاسخ هایی باشد که برنامه شما را ترک می کنند. یک میانافزار ثبتنام ممکن است تمام درخواستهای دریافتی را به برنامه شما ثبت کند.
چندین میانافزار در چارچوب لاراول گنجانده شده است، از جمله میانافزار برای نگهداری، احراز هویت، حفاظت CSRF و موارد دیگر.
همه این میان افزارها در
app/Http/Middleware
دایرکتوری قرار دارند.
تعریف میان افزار
برای ایجاد یک میان افزار جدید، از
make:middleware
دستور Artisan استفاده کنید:
php artisan make:middleware OldMiddleware
OldMiddleware
این دستور یک کلاس جدید را در دایرکتوری شما
قرار می دهد
app/Http/Middleware
.
در این میانافزار، ما فقط در صورتی اجازه دسترسی به مسیر را میدهیم که مقدار ارائهشده
age
بیشتر از 200 باشد. در غیر این صورت، کاربران را به URI "خانه" هدایت میکنیم.
<?php namespace App\Http\Middleware; use Closure; class OldMiddleware { /** * Run the request filter. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->input('age') < 200) { return redirect('home'); } return $next($request); } }
همانطور که می بینید، اگر مقدار داده شده
age
کمتر از باشد
200
، میان افزار یک تغییر مسیر HTTP را به مشتری برمی گرداند.
در غیر این صورت، درخواست بیشتر به برنامه ارسال می شود.
برای ارسال درخواست عمیق تر به برنامه (اجازه دادن به میان افزار برای "عبور")، کافی است
$next
با استفاده از
$request
.
بهتر است میانافزار را بهعنوان یک سری از درخواستهای HTTP «لایهها» تصور کنید که قبل از ورود به برنامه شما باید از آن عبور کنند. هر لایه می تواند درخواست را بررسی کند و حتی آن را به طور کامل رد کند.
قبل / بعد از میان افزار
اینکه یک میان افزار قبل یا بعد از درخواست اجرا شود به خود میان افزار بستگی دارد. این میان افزار قبل از رسیدگی به درخواست توسط برنامه، وظایفی را انجام می دهد :
<?php namespace App\Http\Middleware; use Closure; class BeforeMiddleware implements Middleware { public function handle($request, Closure $next) { // Perform action return $next($request); }}
با این حال، این میان افزار پس از رسیدگی به درخواست توسط برنامه، وظیفه خود را انجام می دهد:
<?php namespace App\Http\Middleware; use Closure; class AfterMiddleware implements Middleware { public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; }}
ثبت نرم افزار میانی
میان افزار جهانی
اگر می خواهید یک میان افزار در طول هر درخواست HTTP برای برنامه شما اجرا شود، به سادگی کلاس میان افزار را در ویژگی کلاس
$middleware
خود فهرست کنید
app/Http/Kernel.php
.
اختصاص نرم افزار میانی به مسیرها
اگر میخواهید میانافزار را به مسیرهای خاصی اختصاص دهید، ابتدا باید میانافزار را یک کلید کوتاه در
app/Http/Kernel.php
فایل خود اختصاص دهید.
به طور پیش فرض،
$routeMiddleware
ویژگی این کلاس حاوی ورودی هایی برای میان افزار موجود در لاراول است.
برای اضافه کردن خود، کافی است آن را به این لیست اضافه کنید و کلید دلخواه خود را به آن اختصاص دهید.
هنگامی که میان افزار در هسته HTTP تعریف شد، می توانید از
middleware
کلید در آرایه گزینه های مسیر استفاده کنید:
Route::get('admin/profile', ['middleware' => 'auth', function(){ //}]);
میان افزار پایان پذیر
گاهی اوقات ممکن است پس از ارسال پاسخ HTTP به مرورگر، یک میان افزار نیاز به انجام کارهایی داشته باشد. به عنوان مثال، میانافزار «session» همراه با لاراول، دادههای جلسه را پس از ارسال پاسخ به مرورگر در فضای ذخیرهسازی مینویسد. برای انجام این کار، می توانید میان افزار را به عنوان "پایان پذیر" تعریف کنید.
use Closure;use Illuminate\Contracts\Routing\TerminableMiddleware; class StartSession implements TerminableMiddleware { public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... } }
همانطور که می بینید، علاوه بر تعریف
handle
متد، متد را
TerminableMiddleware
نیز تعریف کنید
terminate
.
این روش هم درخواست و هم پاسخ را دریافت می کند.
هنگامی که یک میان افزار پایان پذیر تعریف کردید، باید آن را به لیست میان افزارهای جهانی در هسته HTTP خود اضافه کنید.