تعداد بازدید: 1350

Middleware

میان افزار یا Middleware یک مفهوم در مهندسی نرم افزار است. در نرم افزار های لاراول Middleware ها قبل از این که درخواست به controller برود اجرا می شوند تا اغلب بررسی هایی روی خود درخواست و درخواست دهنده پیاده سازی کنند.

middleware ها مکانیزمی برای فیلتر کردن HTTP requests می باشند. پس به صورت شماتیک می توانیم middleware را لایه ای قبل از controller در نظر بگیریم.

middleware filter Http Request

 

نمونه اول از 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 خومان را روی درخواست ها اعمال کنیم.

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای Middleware

دیدگاهتان را بنویسید

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