
تاکنون با ساختار لاراول آشنا شدیم ، محل قرارگیری فایل های مربوط به تنظیمات برنامه و همچنین کار با اونها رو یادگرفتیم، مسیریابی در لاراول رو بررسی کردیم و از ساختار بسیار ساده روتینگ برای دریافت درخواست های url و اتخاذ تصمیم مناسب استفاده کردیم.
در این بخش قصد داریم با middleware یکی دیگه از اجزای اساسی لاراول که وظیفه اون فیلتر کردن درخواستهای ورودی به برنامه هست آشنا بشیم و با مثالهای کاربردی اون رو بررسی کنیم . پس با ما همراه باشید.
Middleware
Middleware یک مکانیسم ساده جهت فیلتر کردن درخواست های ورودی به برنامتون هست.
به طور مثال لاراول یک Middleware با نام auth داره که وظیفه اون احراز هویت کاربران هست. در صورتی که هویت کاربران مشخص شده و لاگین شده باشند، اجازه پیش روی در برنامه و درخواست جدید را صادر و غیراینصورت برنامه به صفحه لاگین هدایت می شود.
تعریف Middleware
برای تعریف Middleware در لاراول کافیست که از طریق ترمینال خود به دایرکتوری برنامه خود رفته و سپس با وارد کردن دستور زیر یکMiddleware ایجاد نمائیم.
php artisan make:middleware LaravelMiddleware
توجه!!. کلیه شروط مربوط به فیلتر کردن درخواست ها در متد handle نوشته می شود.
به کد ذیر توجه کنید:
namespace AppHttpMiddleware;
use Closure;
class OldMiddleware
{
/**
* Run the request filter.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('age') <= 20) {
return redirect('home');
}
return $next($request);
}
}
Before / After Middleware
باتوجه به ساختار Middleware امکان اجرای آن قبل و یا بعد از دریافت درخواستها فراهم شده است.به طور مثال در کلاس زیر دستورات قبل از درخواست اجرا میشود:
namespace AppHttpMiddleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// Perform action
return $next($request);
}
}
namespace AppHttpMiddleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
}
پارامترهای Middleware
به طور مثال اگر در برنامه نیاز به بررسی نقش کاربران در سیستم دارید می توانید از نمونه کد زیر استفاده کنید:
namespace AppHttpMiddleware;
use Closure;
class RoleMiddleware
{
/**
* Run the request filter.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
}
برای استفاده از پارامترها می تونید اونها رو بعد از آرگومان $next به عنوان ورودی متد handle مورد استفاده قرار بدید.
ثبت نام Middleware ها
همچنین در صورت استفاده در مسیردهی (routing) می بایست پس از انتخاب یک نام کلیدی مناسب و ثبت آن در آرایه routeMiddleware از آن استفاده کرد.
به این مثال توجه کنید:
// Within AppHttpKernel Class...
protected $routeMiddleware = [
'auth' => AppHttpMiddlewareAuthenticate::class,
'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
];
استفاده از middleware ها در مسیریابی:
Route::get('admin/profile', ['middleware' => 'auth', function () {
//
}]);
استفاد از چندین middleware در یک مسیردهی
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);