راهنمای Routing در لاراول

ترجمه و تالیف : رضا جمال زاده
تاریخ انتشار : 06 آبان 98
خواندن در 4 دقیقه
دسته بندی ها : لاراول

مسیریابی(Routing) یکی از عناصر اصلی در هر فریمورک وب است. مسیریابی در لاراول به دلیل انعطاف پذیری زیاد این فریمورک بسیار آسان و ساده است.

در این مقاله ما می‌خواهیم بررسی کنیم که چطور مسیریابی در اپلیکیشن می‌تواند برای ایجاد کاربر جدید و URLهایی که از نظر سئو بهینه شده‌اند مورد استفاده قرار گیرد بنابراین بیایید به این موضوع بپردازیم.

مفهوم مسیریابی در لاراول

Routing راهی برای ایجاد urlدرخواست برای برنامه شما است. بهترین ویژگی در مورد مسیریابی در لاراول این است که در این فریمورک شما آزاد هستید که روت‌هایی که نیاز دارید را از روشی که می خواهید و برای شما ساده است، به صورت یکسان تعریف کنید.

در لاراول، همه درخواست‌ها با کمک روت‌ها ترسیم می‌شوند. همه روت‌ها در پوشه route ساخته می‌شوند. برای وب اپلیکیشن‌ها شما می‌توانید روت‌های اپلیکیشن خود را در فایل web.php تعریف کنید و همچنین زمانی که از api استفاده می‌کنید می‌توانید روت‌های خود را در فایل api.php تعریف کنید.

در مثال زیر چگونگی ایجاد یک روت ساده نشان داده شده است:

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

کد بالا مثالی از تعریف یک روت است که یک درخواست که می‌خواهد viewی welcome را به عنوان نتیجه نشان دهد، باز می‌گرداند.

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

در ادامه همه متدهای روت‌ها یا انواع درخواستی که شما می‌توانید در روت لاراول استفاده کنید نوشته شده‌ است: 

  • get
  • post
  • put
  • delete
  • patch
  • options

تعریف روت‌ها با استفاده از توابع کنترلرها

 شما می‌توانید یک متد کنترلر را در یک روت قرار دهید. وقتی که کاربر روت مورد نظر را وارد می‌کند، متد کنترلر تعیین شده باعث اجرای اکشن‌های خاص در اپلیکیشن ما می‌شود. 

مطابق مثال بالا به جای قرار دادن یک تابع به عنوان پارامتر دوم در یک روت، شما می‌توانید کنترلر مورد نظر خود را به همراه متد خاص آن مانند مثال زیر قرار دهید:

Route::get('/about', 'WebController@about');

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

در ادامه ما یک روت را تعریف کردیم و سپس کنترلر به همراه اکشن خاص از آن را قرار دادیم و بین نام کنترلر و اکشن خاص از آن علامت @ قرار دادیم.

استفاده از پارامترها در روت‌های لاراول

دقیقاً مشابه با سایر فریمورک های وب، قرار دادن پارامتر در روت‌های لاراول امکان پذیر است. بیایید یک روت که یک عدد را می‌گیرد و آن را روی صفحه نمایش چاپ می‌کند ایجاد کنیم مانند مثال زیر:

Route::get('/page/{number}', function ($number) {
	echo "Your are on page ". $number;
});

در قطعه کد بالا، ما یک روت که پارامتر number را می‌گیرد و آن را به تابع روت منتقل می‌کند ایجاد کردیم.

حالا، هر وقت که شما /page به همراه یک پارامتر number به عنوان مثال /page/21 را در آدرس بار مرورگر خود قرار دهید، جمله‌ی You are on page 21 را در صفحه‌ نمایش خود مشاهده خواهید کرد. در اینجا پارامتر number هر عددی می‌تواند باشد.

استفاده از پارامترهای اختیاری همراه با مقدار پیشفرض

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

Route::get('/page/{number?}', function ($number = 1) {
	echo "Your are on page ". $number;
});

در ادامه اگر ما روت خود را بدون قرار دادن پارامتر بنویسم به صورت پیش فرض پارامتر number روی عدد ۱ تنظیم می‌شود. در کد مثال قبلی اگر ما هیچ مقداری را به عنوان پارامتر تعیین نکنیم یک ارور ایجاد می‌شود که می‌گوید پارامتر اختیاری نیست و حتما باید قرار داده شود.

استفاده از عبارات منظم در پارامترهای روت‌ها

در کد مثال بالا پارامتر number هر ورودی مانند رشته یا ترکیب رشته و عدد را می‌تواند دریافت کند. اگر بخواهیم نوع پارامتر را به یک عدد معتبر محدود کنیم چه کاری باید انجام دهیم؟ در لاراول، ما می‌توانیم محدودیت‌هایی را روی روت‌ها با اضافه کردن متد where روی روت مورد نظر اعمال کنیم. در این حالت متد where یک نام و یک عبارت منظم به عنوان قانون مورد نظر روی پارامترها می‌گیرد. بیایید یک محدودیت بر روی روت مثال بالا اعمال کنیم تا فقط یک عدد معتبر بر اساس قانون تعیین شده را بپذیرد:

Route::get('/page/{number?}', function ($number = 1) {
	echo "Your are on page ". $number;
})->where('number', '[0-9]+');

در مثال بالا ما یک قانون برای پذیرش فقط اعداد معتبر به عنوان پارامتر تعریف کردیم در ادامه اگر شما تلاش کنید تا یک رشته به عنوان پارامتر قرار دهید در این صورت یک خطای NotFoundHttpException پرتاب می‌شود.

نامگذاری روت‌ها در لاراول

لاراول یک روش ساده برای نامگذاری روت‌های شما ارائه داده است که با این روش ما نیاز به کدنویسی پیچیده و مشکل برای URLهای که در viewهای خود استفاده می‌کنیم نداریم. برای مثال اگر ما بخواهیم که یک فرم را ارسال کنیم و بخواهیم یک اکشن برای فرم خود قرار دهیم، در این حالت ما می‌توانیم از یک نام به جای قرار دادن یک URL طولانی استفاده کنیم.

شما می‌توانید نام یک روت را با استفاده از متد name() تعریف کنید، مانند مثال زیر:

Route::post('/submit', 'ContactFormController@submitForm')->name('contact.submit');

حالا ما می‌توانیم مانند مثال زیر برای متد اکشن یک فرم روت مورد نظر خود را تعریف کنیم:

<form action="{{ route('contact.submit') }}"</form>

گروه‌بندی روت‌ها در لاراول

گروه‌بندی روت‌ها در لاراول به شما اجازه می‌دهد که ویژگی‌های مشترک روت‌ها مانند پیشوندها، middlewares ،namespaces  و... را برای تمام رو‌ت‌های داخل آن گروه به اشتراک بگذارید.

ویژگی‌های مشترک به اشتراک گذاشته شده بین همه روت‌هایی که در یک گروه خاص هستند، در قالب آرایه به عنوان اولین پارامتر در متد Route::group قرار داده می‌شوند:

Route::group(['prefix' => 'posts', 'as' => 'posts.'], function () {
	Route::get('/', 'PostController@index')->name('index');
	Route::get('/create', 'PostController@create')->name('create');
	Route::post('/store' 'PostController@store')->name('store');
});

در گروه روت بالا، URLهای زیر ایجاد می‌شوند:

۱-/posts با نام posts.index

۲- /posts/create با نام posts.create

۳- /posts/store با نام posts.store

در گروه روت بالا، پیشوند همه‌ی روت‌های موجود در گروه، posts است و همچنین post به ابتدای نام روت‌ها با استفاده از posts. اضافه می‌شود.

همچنین در لاراول ایجاد گروه‌های تو در تو برای روت‌ها امکان پذیر است. فرض کنید در کد مثال بالا ما قصد داریم که عملیات ایجاد و ذخیره (create and store) فقط توسط کاربرانی که در سیستم لاگین هستند امکان پذیر باشد برای پیاده‌سازی این امر ما یک گروه روت دیگر ایجاد می‌کنیم و دو روت را در این گروه جدید اضافه می‌کنیم و برای این گروه یک middleware مانند زیر تنظیم می‌کنیم:

Route::group(['prefix' => 'posts', 'as' => 'posts.'], function () {

	Route::get('/', 'PostController@index')->name('index');

	Route::group(['middleware' => ['auth']], function () {
		Route::get('/create', 'PostController@create')->name('create');
		Route::post('/store' 'PostController@store')->name('store');
	});
});

استفاده از namespace در گروه‌های روت لاراول

ما می‌توانیم namespace برای کنترلرهایی که در گروه روت ما استفاده می‌شوند، تعریف کنیم مانند زیر:

Route::group(['namespace' => 'Post'])
// this route group will load all controllers 
//from within the "App\Http\Controllers\Post"

بدین ترتیب، در مثال بالا ما می‌توانیم مانند کد پایین یک namespace برای گروه روت تعریف کنیم:

Route::group(['namespace' => 'Post','prefix' => 'posts', 'as' => 'posts.'], function () {

	Route::get('/', 'PostController@index')->name('index');

	Route::group(['middleware' => ['auth']], function () {
		Route::get('/create', 'PostController@create')->name('create');
		Route::post('/store' 'PostController@store')->name('store');
	});
});

نکته: جهت اطلاع بیشتر، شما می‌توانید از متدهای prefix() ، namespace() و دیگر متدهای روت به جای استفاده از فرمت آرایه استفاده کنید. من استفاده از فرمت آرایه را ترجیح می‌دهم چون استفاده از آن باعث تمیزتر شدن کدها می‌شود.

کش کردن روت‌ها

لاراول همه روت‌ها را برای سریع‌تر شدن اپلیکیشن شما کش می‌کند. گاهی اوقات ممکن است در شرایطی قرار بگیرید که روت‌های شما مطابق آنچه انتظار دارید کار نکنند. این مشکل می‌تواند ناشی از کش شدن روت‌های شما باشد. شما می‌توانید کد زیر را در ترمینال خود وارد کنید و به وسیله‌ی آن همه‌ی روت‌های کش شده را پاک کنید:

php artisan route:clear

همچنین اگر شما می‌خواهید روت‌های خود را کش کنید می توانید کد زیر را در ترمینال خود وارد کنید:

php artisan route:cache

دیباگ کردن روت‌ها

شما می‌توانید همه روت‌های ثبت شده در اپلیکیشن خود را با وارد کردن کد زیر در ترمینال خود مشاهده کنید:

php artisan route:list

با استفاده از کد بالا در ترمینال، شما می‌توانید لیست نام روت‌ها، URLs، middlewares و موارد دیگر مشاهده کنید. این روش یکی از روش‌های مناسب برای خطایابی روت‌ها است.

نتیجه‌گیری

همانطور که دیدید لاراول یک سیستم مسیریابی قدرتمند را ارائه می‌دهد. برای کسب اطلاعات بیشتر در مورد روت‌ها شما می‌توانید از مستندات سایت لاراول قسمت مربوط به روت‌ها استفاده کنید همچنین از مقاله چگونگی مدیریت روت‌ها در پروژه‌های بزرگ، برای مدیریت بهتر روت‌های خود در اپلیکیشن‌های بزرگ استفاده کنید.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید