فهرست:
مقدمه آشنایی با Middleware در لاراول
Middleware
به عنوان یک رابط بین request
و response
عمل می کند و در واقع نوعی مکانیسم بررسی است. در این مبحث Middleware
را بطور اختصاری برای شما شرح می دهیم. به عنوان مثال فرض کنید باید کاربری را احراز هویت کنیم، با کمک Middleware
می توانیم بررسی کنیم کاربری که وارد ساید شده است به صفحه اصلی هدایت و در غیر این صورت به صفحه ورود هدایت شود. Middleware
را می توان با اجرای دستور زیر ایجاد کرد.
php artisan make:middleware <middleware-name>
در خط فرمان بالا می توانید
را با نام Middleware
خود جایگزین کنید. Middleware
ایجاد شده را می توانید در فهرست app/Http/Middleware
مشاهده کنید. برای درک بهتر مثال زیر را بررسی می کنیم. مرحله اول: AgeMiddleware
را ایجاد با دستور زیر ایجاد می کنیم.
php artisan make:middleware AgeMiddleware
مرحله دوم: AgeMiddleware
در app/ Http/Middleware
ایجاد خواهد شد. فایل جدید ایجاد شده دارای کد زیر است.
app/Http/Middleware
<?php
namespace App\Http\Middleware;
use Closure;
class AgeMiddleware {
public function handle($request, Closure $next) {
return $next($request);
}
}
رجیستر کردن Middleware در لاراول
ما به دو صورت می توانیم Middleware در لاراول تعریف نماییم:
- Global Middleware
- Route Middleware
در لاراول Global Middleware
بر روی هر درخواست HTTP
از برنامه اجرا می شود، در حالی که Middleware Route
به یک مسیر خاص اختصاص می یابد. Middleware
را می توان در app/Http/Kernel.php
تعریف نمود. در این فایل دو متغیر $middleware
و $routeMiddleware
وجود دارند، از $middleware
برای تعریف Middleware Global
و از $routeMiddleware
برای Route Middleware
برای یک Route
خاص استفاده می شود. برای بکار بردن Global Middleware
از متغیر $middleware
بصورت زیر استفاده می کنیم.
app/Http/Kernel.php
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];
برای بکار بردن Route Middleware
از متغیر $routeMiddleware
بصورت زیر استفاده می کنیم.
app/Http/Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];
در مثال قبل AgeMiddleware
را ایجاد کرده ایم. اکنون می توانیم آن را در دو ویژگی Global Middleware
و Route Middleware
بصورت زیر در فایل app/Http/Kernel.php
تعریف کنیم.
app/Http/Kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel {
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'Age' => \App\Http\Middleware\AgeMiddleware::class,
];
}
پارامتر ها در Middleware
ما همچنین می توانیم پارامترها را با Middleware
پاس دهیم به عنوان مثال ، اگر برنامه شما دارای رول های مختلفی مانند user ، admin ، super admin و غیره باشد، می توانید اعتبار سنجی خود را بر مبنای سطوح دسترسی مختلف با پاس دادن پارامتر در Middleware
انجام دهید. برای این منظور Middleware
مورد نظر را با همانند function
زیر با آرگومان سفارشی خود و پس از آرگومان $next
ایجاد می کنیم.
public function handle($request, Closure $next) {
return $next($request);
}
برای درک بهتر این مورد به مثال زیر دقت کنید ابتدا با خط فرمان زیر RoleMiddleware
را ایجاد می کنیم.
php artisan make:middleware RoleMiddleware
کد زیر را به فایل ایجاد شده برای RoleMiddlewareat
در مسیر Http/Middleware/RoleMiddleware.php
اضافه کنید.
<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware {
public function handle($request, Closure $next, $role) {
echo "Role: ".$role;
return $next($request);
}
}
RoleMiddleware
را در فایل app/Http/Kernel.php
همانند خط هایلایت شده در خط هفتم مثال زیر رجیستر کنید.
app/Http/Kernel.php
class Kernel extends HttpKernel {
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'Age' => \App\Http\Middleware\AgeMiddleware::class,
'Role' => \App\Http\Middleware\RoleMiddleware::class,
];
}
حال با خط فرمان زیر TestController
را ایجاد نمایید.
php artisan make:controller TestController --plain
حال به فایل app/Http/TestController.php
مراجعه و کد زیر را در آن قرار دهید.
app/Http/TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class TestController extends Controller {
public function index() {
echo "<br>Test Controller.";
}
}
به فایل app/Http/routes.php
مراجعه و کد زیر را در آن قرار دهید. با اضافه کردن یک دونقطه (:) بعد از اسم میدلور، میتونیم پارامتر پاس بدیم.
app/Http/routes.php
Route::get('role',[
'middleware' => 'Role:editor',
'uses' => 'TestController@index',
]);
بسیار خوب کار تمام است برای بررسی پارامتر ها در Middleware در مثال فوق به آدرس زیر مراجعه نمایید.
http://localhost:8000/role
خروجی مرورگر شما بصورت زیر خواهد بود.
Role:editor
Test Controller.
Terminable Middleware
چنانچه قصد داشته باشید بعد از ارسال response
به مرورگر یک فرایند مشخص انجام شود از Terminable Middleware
استفاده می کنیم. Terminable Middleware
ها بصورت global middleware
رجیستر خواهند شد و دو آرگومان $request
و $response
را دریافت می کنند.
برای درک بهتر این مورد به مثال زیر دقت کنید ابتدا با خط فرمان زیر TerminateMiddleware
را ایجاد می کنیم.
php artisan make:middleware TerminateMiddleware
کد زیر را به فایل ایجاد شده برای TerminateMiddleware
در مسیر app/Http/Middleware/TerminateMiddleware.php
اضافه کنید.
app/Http/Middleware/TerminateMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class TerminateMiddleware {
public function handle($request, Closure $next) {
echo "Executing statements of handle method of TerminateMiddleware.";
return $next($request);
}
public function terminate($request, $response) {
echo "<br>Executing statements of terminate method of TerminateMiddleware.";
}
}
TerminateMiddleware
را در فایل app/Http/Kernel.php
همانند خط هایلایت شده در خط هشتم مثال زیر رجیستر کنید.
app/Http/Kernel.php
class Kernel extends HttpKernel {
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'Age' => \App\Http\Middleware\AgeMiddleware::class,
'Role' => \App\Http\Middleware\RoleMiddleware::class,
'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
];
}
حال با خط فرمان زیر ABCController
را ایجاد نمایید.
php artisan make:controller ABCController --plain
حال به فایل app/Http/ABCController.php
مراجعه و کد زیر را در آن قرار دهید.
app/Http/ABCController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class ABCController extends Controller {
public function index() {
echo "<br>ABC Controller.";
}
}
به فایل app/Http/routes.php
مراجعه و کد زیر را در آن قرار دهید.
app/Http/routes.php
Route::get('terminate',[
'middleware' => 'terminate',
'uses' => 'ABCController@index',
]);
بسیار خوب کار تمام است به آدرس زیر مراجعه نمایید.
http://localhost:8000/terminate
خروجی مرورگر شما بصورت زیر خواهد بود.
Executing statements of handle method of TerminateMiddleware.
ABC Controller.
Executing statements of terminate method of TerminateMiddleware.