- پنجشنبه 20 دی 1397 ساعت 16:18
- 5.6.29
- در حال تکمیل
- منقضی شده
مقدمه
میدلورها مکانیزم مناسبی را برای فیلتر کردن ریکوئستهای HTTP ورودی به اپلیکیشن ارائه میدهند. برای مثال، میدلوری در لاراول وجود دارد که بررسی میکند که آیا کاربر اپلیکیشن احراز هویت (لاگین) شده است یا خیر. اگر کاربر احراز هویت نشده باشد، میدلور، کاربر را به صفحه لاگین ریدایرکت میکند. اما، اگر کاربر احراز هویت شده باشد، میدلور به ریکوئست اجازه میدهد تا برای پردازشهای بعدی توسط اپلیکیشن به راه خود ادامه دهد.
طبیعتا، امکان نوشتن میدلورهای بیشتری وجود دارد تا علاوه بر اعتبارسنجی احراز هویت، بتوان تسکهای گوناگون دیگری را نیز اجرا کرد. یک میدلور CORS میتواند مسئولیت افزودن هدرهای مناسب به تمام ریسپانسهای تولید شده توسط اپلیکیشنتان را به عهده بگیرد. میدلوری با نام logging میتواند تمام ریکوئستهای ورودی به اپلیکیشنتان را لاگ کند.
میدلورهای مختلفی در لاراول اینکلود شدهاند، از جمله میدلورهای authentication و CSRF protection. تمامی این میدلورها، در دایرکتوری app/Http/Middleware
قرار گرفتهاند.
تعریف کردن میدلور
برای ایجاد یک میدلور جدید، از کامند آرتیسان make:middleware
استفاده کنید:
php artisan make:middleware CheckAge
این کامند یک کلاس CheckAge
جدید در دایرکتوری app/Http/Middleware
قرار میدهد. در صورت استفاده از این میدلور، تنها اگر age
بیشتر از 200 باشد به روت دسترسی داریم، در غیر این صورت، به URI مربوط به home
ریدایرکت خواهیم شد.
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->age <= 200) {
return redirect('home');
}
return $next($request);
}
}
همانطوری که مشاهده میکنید، اگر age
کمتر یا مساوی 200
باشد، میدلور یک ریدایرکت HTP به کلاینت برمیگرداند؛ به عبارت دیگر، ریکوئست اجازه دارد برای پردازشهای بعدی از سد میدلور عبور کند. برای اینکه ریکوئست به میزان عمیقتری به اپلیکیشن وارد شود (میدلور اجازه عبور دهد)، باید کالبَک $next
با پارامتر $request
فراخوانی شود.
بهتر است که میدلور را به عنوان یک سری "لایه" برای ریکوئستهای HTTP در نظر بگیریم که قبل از رسیدن به اپلیکیشن، باید از آنها عبور کنند. هر لایه میتواند ریکوئست را مورد بررسی قرار داده و یا حتی به صورت کامل آن را رد کند.
تمامی میدلورها توسط سرویس کانتینرها ریزالو میشوند، بنابراین میتواند هر وابستگی را که میخواهید درون متد constructor میدلور type-hint کنید.
میدلورهای Before و After
اینکه یک میدلور، قبل یا بعد از یک ریکوئست اجرا شود، به خود میدلور بستگی دارد. برای مثال، میدلور زیر میتواند به منظور اجرای تعدادی تسک، قبل از اینکه ریکوئست توسط اپلیکیشن هندل شود، استفاده شود:
<?php
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// Perform action
return $next($request);
}
}
اما، این میدلور میتواند به منظور اجرای تسکهای خود، بعد از اینکه ریکوئست توسط اپلیکیشن هندل شد، استفاده شود:
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
}
رجیستر کردن میدلورها
گلوبال میدلور
اگر میخواهید هر ریکوئست HTTP که به اپلیکیشنتان ارسال شد، میدلور خاصی بر روی آن اجرا شود، کلاس میدلور را به لیست میدلورهای گلوبال در پراپرتی $middleware
در کلاس app/Http/Kernel.php
اضافه کنید.
تعیین میدلور برای روت
اگر میخواهید که میدلوری را برای یک روت خاص تعیین کنید، ابتدا باید در فایل app/Http/Kernel.php
یک کلید برای میدلور تعیین کنید. به صورت پیشفرض، پراپرتی $routeMiddleware
این کلاس حاوی میدلورهای اینکلود شده توسط لاراول است. برای افزودن میدلورتان، آن را به انتهای این لیست افزوده و یک کلید برای آن تعیین کنید. برای مثال:
// Within App\Http\Kernel Class...
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
هنگامی که میدلور را در کرنل HTTP تعریف کردید، میتوانید از متد middleware
برای تعیین یک میدلور برای یک روت استفاده کنید:
Route::get('admin/profile', function () {
//
})->middleware('auth');
همچنین میتوانید برای یک روت چندین میدلور تعیین کنید:
Route::get('/', function () {
//
})->middleware('first', 'second');
همچنین در هنگام تعیین میدلور، میتوانید نام کامل کلاس آن را به متد middleware
پاس دهید:
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);
گروههای میدلور
گاهی ممکن است بخواهید میدلورهای مختلف را تحت یک کلید واحد گروهبندی کنید تا بتوانید راحتتر آنها را به یک روت تخصیص دهید. اینکار را با استفاده از پراپرتی $middlewareGroups
کرنل HTTP میتوانید انجام دهید.
به صورت از قبل آماده شده، گروه میدلورهای web
و api
در لاراول گنجانده شدهاند که حاوی میدلور مشترکی هستند که میتوانید به روتهای API و web اعمال کنید:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\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,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'auth:api',
],
];
با استفاده از سینتکسی مشابه سینتکس میدلور، میتوان گروههای میدلور را نیز به روتها یا اکشنهای کنترلر تخصیص داد. یادآوری، گروههای میدلوری، تخصیص یکباره تعدادی میدلور به یک روت را راحتتر میکنند:
Route::get('/', function () {
//
})->middleware('web');
Route::group(['middleware' => ['web']], function () {
//
});
به صورت از قبل آماده شده، گروه میدلور web
به صورت خودکار توسط RouteServiceProvider
به فایل routes/web.php
اعمال میشود.
پارامترهای میدلور
همچنین میدلورها میتوانند پارامترهای اضافهتری بگیرند. برای مثال، اگر میخواهید که قبل از اجرای اکشن مشخصی، اپلیکیشن بررسی کند که آیا کاربر احراز هویت شده دارای role خاصی است، میتوانید میدلوری با نام CheckRole
ایجاد کنید که نام role را به عنوان یک آرگومان اضافه دریافت میکند.
پارامترهای اضافه میدلور، بعد از آرگومان $next
به میدلور پاس داده میشوند:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckRole
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $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);
}
}
پارامترهای میدلور میتوانند در هنگام تعریف روت مشخص شوند، نام میدلور و پارامترا با :
جدا میشوند. پارامترهای بعدی نیز با کاما جدا میشوند:
Route::put('post/{id}', function ($id) {
//
})->middleware('role:editor');
میدلور پایانپذیر
گاهی یک میدلور ممکن است نیاز به انجام کارهایی پس از آماده شدن ریسپانس HTTP داشته باشد. برای مثال، میدلور session که در لاراول اینکلود شده است، پس از اینکه ریسپانس کاملا آماده شد، دادههای سشن را در storage مینویسد. اگر یک متد terminate
برای میدلور خود تعریف کنید، پس از اینکه ریسپانس آماده ارسال به مرورگر بود، این متد به صورت خودکار فراخوانی میشود.
<?php
namespace Illuminate\Session\Middleware;
use Closure;
class StartSession
{
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
// Store the session data...
}
}
متد terminate
باید هم ریکوئست و هم ریسپانس را دریافت کند. هنگامی که یک میدلور terminable تعریف میکنید، باید آن را به لیست میدلورهای روت یا میدلورهای گلوبال در فایل app/Http/Kernel.php
اضافه کنید.
هنگامی که متد terminate
بر روی میدلور فراخوانی میشود، لاراول یک نمونه تازه (fresh instance) از میدلور را از داخل سرویس کانتینر ریزالو میکند. اگر میخواهید هنگامی که متدهای و فراخوانی میشوند، از نمونه میدلور یکسانی استفاده کنید، با استفاده از متد singleton
کانتینر، آن میدلور را در کانتینر رجیستر کنید.
سایر پستهای داکیومنت
- پیشگفتار
- Release Notes ترجمه در ورژنهای بعدی
- راهنمای آپگرید ترجمه در ورژنهای بعدی
- Contribution Guide ترجمه در ورژنهای بعدی
- شروع
- نصب
- پیکربندی
- ساختار دایرکتوری ترجمه در ورژنهای بعدی
- Laravel Homestead ترجمه در ورژنهای بعدی
- Laravel Valet ترجمه در ورژنهای بعدی
- دپلویمنت ترجمه در ورژنهای بعدی
- مفاهیم معماری
- چرخه کار ریکوئستها
- Service Container ترجمه در ورژنهای بعدی
- سرویس پرووایدرها
- فسادها ترجمه در ورژنهای بعدی
- Contracts ترجمه در ورژنهای بعدی
- اصول اولیه
- مسیریابی
- میدلور
- حفاظت در مقابل حملات CSRF
- کنترلرها
- HTTP Requests ترجمه در ورژنهای بعدی
- HTTP Responses ترجمه در ورژنهای بعدی
- ویوها
- تولید URL
- HTTP Session ترجمه در ورژنهای بعدی
- Validation ترجمه در ورژنهای بعدی
- Error Handling ترجمه در ورژنهای بعدی
- Logging ترجمه در ورژنهای بعدی
- فرانتاند
- تمپلتهای Blade
- محلیسازی
- JavaScript & CSS Scaffolding ترجمه در ورژنهای بعدی
- Compiling Assets (Laravel Mix) ترجمه در ورژنهای بعدی
- امنیت
- Authentication ترجمه در ورژنهای بعدی
- API Authentication (Passport) ترجمه در ورژنهای بعدی
- Authorization ترجمه در ورژنهای بعدی
- Encryption ترجمه در ورژنهای بعدی
- Hashing ترجمه در ورژنهای بعدی
- Resetting Passwords ترجمه در ورژنهای بعدی
- مباحث عمیقتر
- Artisan Console ترجمه در ورژنهای بعدی
- Broadcasting ترجمه در ورژنهای بعدی
- Cache ترجمه در ورژنهای بعدی
- Collections ترجمه در ورژنهای بعدی
- Events ترجمه در ورژنهای بعدی
- File Storage ترجمه در ورژنهای بعدی
- Helpers ترجمه در ورژنهای بعدی
- Mail ترجمه در ورژنهای بعدی
- Notifications ترجمه در ورژنهای بعدی
- Package Development ترجمه در ورژنهای بعدی
- Queues ترجمه در ورژنهای بعدی
- Task Scheduling ترجمه در ورژنهای بعدی
- دیتابیس
- دیتابیس: شروع ترجمه در ورژنهای بعدی
- Database: Query Builder ترجمه در ورژنهای بعدی
- دیتابیس: صفحهبندی
- دیتابیس: مایگریشن
- دیتابیس: سیدینگ
- Redis ترجمه در ورژنهای بعدی
- Eloquent ORM
- Eloquent: Getting Started ترجمه در ورژنهای بعدی
- Eloquent: Relationships ترجمه در ورژنهای بعدی
- Eloquent: Collections ترجمه در ورژنهای بعدی
- Eloquent: Mutators ترجمه در ورژنهای بعدی
- Eloquent: API Resources ترجمه در ورژنهای بعدی
- Eloquent: Serialization ترجمه در ورژنهای بعدی
- Testing
- Testing: Getting Started ترجمه در ورژنهای بعدی
- HTTP Tests ترجمه در ورژنهای بعدی
- Browser Tests (Laravel Dusk) ترجمه در ورژنهای بعدی
- Database Testing ترجمه در ورژنهای بعدی
- Mocking ترجمه در ورژنهای بعدی
- Official Packages
- Laravel Cashier ترجمه در ورژنهای بعدی
- Envoy Task Runner ترجمه در ورژنهای بعدی
- Laravel Horizon ترجمه در ورژنهای بعدی
- API Authentication (Passport) ترجمه در ورژنهای بعدی
- Laravel Scout ترجمه در ورژنهای بعدی
- Laravel Socialite ترجمه در ورژنهای بعدی