دریافت پارامترهای Route در Middleware لاراول

امروز درباره‌ی این صحبت می‌کنیم که چطور می‌توان پارامترهای Route را داخل Middleware در Laravel استفاده کرد؛ کاری که احتمالاً در روند توسعه‌ی پروژه با آن روبه‌رو می‌شوید.


Middleware چیست؟

یک Middleware در واقع درخواست (Request) اپلیکیشن را در بر می‌گیرد.

به این شکل تصورش کنید:
وقتی یک درخواست به اپلیکیشن شما ارسال می‌شود، کدی وجود دارد که آن درخواست را پردازش می‌کند. اما اگر بخواهید قبل یا بعد از اجرای آن کد کاری انجام شود، باید از Middleware استفاده کنید.

لاراول به‌صورت پیش‌فرض چند Middleware داخلی دارد، مثل:

  • Maintenance mode

  • Authentication

  • محافظت CSRF

که همه‌ی آن‌ها در مسیر زیر قرار دارند:

app/Http/Middleware

پارامترهای Route در Laravel

Routeهای لاراول در فایل زیر قرار دارند:

app/Http/routes.php

هر Route معمولاً شامل:

  • مسیر URL

  • یک تابع Handler (یا متد Controller)

مثال Route با تابع ساده:

Route::get('/', function () {
return view('welcome');
});

مثال Route با Controller:

Route::get('/profile', 'ProfileController@index');

ارسال پارامتر در Route

برای ارسال پارامتر در Route از آکولاد {} استفاده می‌کنیم.

مثلاً:

Route::get('/params/{name}', function ($name) {
return $name;
});

طبق قرارداد، متد Controller پارامترها را با همان نام دریافت می‌کند.


دسترسی به پارامتر Route داخل Middleware

اما دسترسی به پارامترها در Middleware کمی متفاوت است.

ابتدا یک Middleware جدید می‌سازیم:

php artisan make:middleware DumpMiddleware

فایل زیر ساخته می‌شود:

app/Http/Middleware/DumpMiddleware.php

روش اول: استفاده از route() روی Request

می‌توان پارامتر را این‌طور دریافت کرد:

$request->route('parameter_name');

در متد handle:

public function handle($request, Closure $next)
{
dd($request->route('parameter_name'));
return $next($request);
}

اضافه کردن Middleware به Route

Route::get('/params/{name}', [
'middleware' => 'App\Http\Middleware\DumpMiddleware',
function () {
return view('welcome');
}
]);

ثبت Middleware در Kernel

در فایل:

App\Http\Kernel.php
protected $routeMiddleware = [
'DumpMiddleware' => \App\Http\Middleware\DumpMiddleware::class,
];

حالا می‌توانید بنویسید:

'middleware' => 'DumpMiddleware'

اجرای پروژه

php artisan serve

باز کردن:

http://localhost:8000/params/scotch

پارامتر scotch نمایش داده می‌شود.


روش دوم: دریافت همه پارامترها

اگر Route چند پارامتر داشته باشد:

/params/{id}/{category}/{name}

می‌توان همه را به‌صورت آرایه گرفت:

$request->route()->parameters();

در Middleware:

public function handle($request, Closure $next)
{
dd($request->route()->parameters());
return $next($request);
}

باز کردن:

http://localhost:8000/params/23/scotch/school

پارامترها به‌صورت آرایه نمایش داده می‌شوند.


چرا باید پارامتر Route را در Middleware بخوانیم؟

فرض کنید Route زیر برای پروفایل کاربران است:

/{username}

مثلاً:

http://localhost:8000/scotch

اما سایت شما مسیرهایی مثل:

  • faq

  • help

  • support

هم دارد.

روش معمول این است که این مسیرها را قبل از Route پروفایل تعریف کنید:

Route::get('/faq', function() {
return view('faq');
});

اما با Middleware می‌توان این کار را تمیزتر انجام داد.


استفاده عملی از Middleware

Route:

Route::get('/{username}', [
'middleware' => 'ProfileMiddleware',
function () {
return view('welcome');
}
]);

Middleware:

class ProfileMiddleware
{
public function handle($request, Closure $next)
{
$routes = ["faq", "support", "help"];
$route = $request->route('username');
if (in_array($route, $routes)) {
return new Response(view($route));
}

return $next($request);
}
}

در اینجا:

  • بررسی می‌کنیم پارامتر در آرایه وجود دارد یا نه

  • اگر وجود داشت، View مربوطه نمایش داده می‌شود

اگر بعدها کلمات دیگری اضافه شد، فقط کافی است آن‌ها را به آرایه اضافه کنیم.

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

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

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