نسخه:

مسیریابی HTTP

مسیریابی پایه

شما اکثر مسیرها را برای برنامه خود در app/Http/routes.php فایلی که توسط کلاس بارگذاری می شود، تعریف خواهید کرد App\Providers\RouteServiceProvider . ابتدایی ترین مسیرهای لاراول به سادگی یک URI و یک Closure :

مسیر اصلی GET

Route::get('/', function()
{
return 'Hello World';
});

سایر مسیرهای اساسی

Route::post('foo/bar', function()
{
return 'Hello World';
});
 
Route::put('foo/bar', function()
{
//
});
 
Route::delete('foo/bar', function()
{
//
});

ثبت یک مسیر برای افعال چندگانه

Route::match(['get', 'post'], '/', function()
{
return 'Hello World';
});

ثبت مسیری که به هر فعل HTTP پاسخ می دهد

Route::any('foo', function()
{
return 'Hello World';
});

اغلب، شما نیاز به ایجاد URL برای مسیرهای خود دارید، می توانید این کار را با استفاده از url کمک کننده انجام دهید:

$url = url('foo');

حفاظت CSRF

لاراول محافظت از برنامه شما را در برابر جعل درخواست های بین سایتی آسان می کند . جعل درخواست های بین سایتی نوعی سوء استفاده مخرب است که به موجب آن دستورات غیرمجاز از طرف کاربر احراز هویت شده انجام می شود.

لاراول برای هر جلسه کاربر فعال که توسط برنامه مدیریت می شود، به طور خودکار یک "توکن" CSRF تولید می کند. این نشانه برای تأیید اینکه کاربر احراز هویت شده کسی است که واقعاً درخواست ها را به برنامه ارسال می کند استفاده می شود.

توکن CSRF را در یک فرم قرار دهید

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

البته با استفاده از موتور قالب سازی Blade :

<input type="hidden" name="_token" value="{{ csrf_token() }}">

در درخواست‌های POST، PUT یا DELETE نیازی به تأیید دستی نشانه CSRF ندارید. میان‌افزار VerifyCsrfToken HTTP تأیید می‌کند که توکن در ورودی درخواست با توکن ذخیره‌شده در جلسه مطابقت دارد.

X-CSRF-TOKEN

علاوه بر جستجوی رمز CSRF به عنوان پارامتر "POST"، میان افزار X-CSRF-TOKEN هدر درخواست را نیز بررسی می کند. برای مثال می‌توانید توکن را در یک تگ متا ذخیره کنید و به jQuery دستور دهید تا آن را به تمام هدرهای درخواست اضافه کند:

<meta name="csrf-token" content="{{ csrf_token() }}" />
 
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});

اکنون تمام درخواست های AJAX به طور خودکار شامل توکن CSRF می شوند:

$.ajax({
url: "/foo/bar",
})

X-XSRF-TOKEN

لاراول همچنین توکن CSRF را در یک XSRF-TOKEN کوکی ذخیره می کند. می توانید از مقدار کوکی برای تنظیم X-XSRF-TOKEN هدر درخواست استفاده کنید. برخی از فریم ورک های جاوا اسکریپت، مانند Angular، این کار را به صورت خودکار برای شما انجام می دهند.

نکته: تفاوت بین X-CSRF-TOKEN و این X-XSRF-TOKEN است که اولی از مقدار متن ساده استفاده می کند و دومی از مقدار رمزگذاری شده استفاده می کند، زیرا کوکی ها در لاراول همیشه رمزگذاری می شوند. csrf_token() اگر از تابع برای ارائه مقدار توکن استفاده می کنید ، احتمالاً می خواهید از X-CSRF-TOKEN هدر استفاده کنید.

روش جعل

PUT فرم‌های HTML از PATCH یا DELETE اقدامات پشتیبانی نمی‌کنند . بنابراین، هنگام تعریف PUT یا مسیرهایی که از یک فرم PATCH HTML DELETE فراخوانی می شوند، باید یک _method فیلد مخفی به فرم اضافه کنید.

مقدار ارسال شده با _method فیلد به عنوان روش درخواست HTTP استفاده می شود. مثلا:

<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
</form>

پارامترهای مسیر

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

پارامتر اصلی مسیر

Route::get('user/{id}', function($id)
{
return 'User '.$id;
});

توجه: پارامترهای مسیر نمی توانند شامل - کاراکتر باشند. به جای آن از زیرخط ( _ ) استفاده کنید.

پارامترهای مسیر اختیاری

Route::get('user/{name?}', function($name = null)
{
return $name;
});

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

Route::get('user/{name?}', function($name = 'John')
{
return $name;
});

محدودیت های پارامتر بیان منظم

Route::get('user/{name}', function($name)
{
//
})
->where('name', '[A-Za-z]+');
 
Route::get('user/{id}', function($id)
{
//
})
->where('id', '[0-9]+');

عبور از یک آرایه از محدودیت ها

Route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

تعریف الگوهای جهانی

اگر می خواهید یک پارامتر مسیر همیشه توسط یک عبارت منظم محدود شود، می توانید از pattern روش استفاده کنید. شما باید این الگوها را در boot روش خود تعریف کنید RouteServiceProvider :

$router->pattern('id', '[0-9]+');

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

Route::get('user/{id}', function($id)
{
// Only called if {id} is numeric.
});

دسترسی به مقدار پارامتر مسیر

اگر نیاز به دسترسی به مقدار پارامتر مسیر در خارج از مسیر دارید، از input روش زیر استفاده کنید:

if ($route->input('id') == 1)
{
//
}

همچنین می توانید از طریق نمونه به پارامترهای مسیر فعلی دسترسی داشته باشید Illuminate\Http\Request . نمونه درخواست برای درخواست فعلی ممکن است از طریق Request نما یا با تایپ کردن Illuminate\Http\Request جایی که وابستگی ها تزریق می شوند قابل دسترسی باشد:

use Illuminate\Http\Request;
 
Route::get('user/{id}', function(Request $request, $id)
{
if ($request->route('id'))
{
//
}
});

مسیرهای نامگذاری شده

مسیرهای نامگذاری شده به شما این امکان را می دهند که به راحتی URL ها یا تغییر مسیرها را برای یک مسیر خاص ایجاد کنید. می توانید با کلید آرایه یک نام برای مسیر مشخص کنید as :

Route::get('user/profile', ['as' => 'profile', function()
{
//
}]);

همچنین می توانید نام مسیرها را برای اقدامات کنترلر مشخص کنید:

Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);

اکنون، می‌توانید از نام مسیر هنگام ایجاد URL یا تغییر مسیر استفاده کنید:

$url = route('profile');
 
$redirect = redirect()->route('profile');

متد currentRouteName نام مسیری را که درخواست فعلی را مدیریت می کند برمی گرداند:

$name = Route::currentRouteName();

گروه های مسیر

گاهی اوقات بسیاری از مسیرهای شما نیازمندی‌های مشترکی مانند بخش‌های URL، میان‌افزار، فضاهای نام و غیره را دارند. به‌جای تعیین هر یک از این گزینه‌ها در هر مسیر به صورت جداگانه، ممکن است از یک گروه مسیر برای اعمال ویژگی‌ها برای بسیاری از مسیرها استفاده کنید.

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

میان افزار

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

Route::group(['middleware' => ['foo', 'bar']], function()
{
Route::get('/', function()
{
// Has Foo And Bar Middleware
});
 
Route::get('user/profile', function()
{
// Has Foo And Bar Middleware
});
 
});

فضاهای نام

می توانید از namespace پارامتر موجود در آرایه ویژگی گروه خود برای تعیین فضای نام برای همه کنترلرهای درون گروه استفاده کنید:

Route::group(['namespace' => 'Admin'], function()
{
// Controllers Within The "App\Http\Controllers\Admin" Namespace
 
Route::group(['namespace' => 'User'], function()
{
// Controllers Within The "App\Http\Controllers\Admin\User" Namespace
});
});

توجه: به طور پیش‌فرض، فایل RouteServiceProvider شما routes.php را در یک گروه فضای نام شامل می‌شود و به شما امکان می‌دهد مسیرهای کنترلر را بدون تعیین App\Http\Controllers پیشوند فضای نام کامل ثبت کنید.

مسیریابی زیر دامنه

مسیرهای لاراول همچنین زیر دامنه های wildcard را مدیریت می کنند و پارامترهای wildcard شما را از دامنه ارسال می کنند:

ثبت مسیرهای زیر دامنه

Route::group(['domain' => '{account}.myapp.com'], function()
{
 
Route::get('user/{id}', function($account, $id)
{
//
});
 
});

پیشوند مسیر

گروهی از مسیرها ممکن است با استفاده از prefix گزینه موجود در آرایه ویژگی های یک گروه پیشوند شوند:

Route::group(['prefix' => 'admin'], function()
{
Route::get('users', function()
{
// Matches The "/admin/users" URL
});
});

همچنین می توانید از این prefix پارامتر برای ارسال پارامترهای رایج به مسیرهای خود استفاده کنید:

ثبت پارامتر URL در پیشوند مسیر

Route::group(['prefix' => 'accounts/{account_id}'], function()
{
Route::get('detail', function($account_id)
{
//
});
});

حتی می توانید محدودیت های پارامتری را برای پارامترهای نامگذاری شده در پیشوند خود تعریف کنید:

Route::group([
'prefix' => 'accounts/{account_id}',
'where' => ['account_id' => '[0-9]+'],
], function() {
 
// Define Routes Here
});

اتصال مدل مسیر

Binding مدل Laravel یک راه راحت برای تزریق نمونه های کلاس به مسیرهای شما فراهم می کند. به عنوان مثال، به جای تزریق شناسه کاربر، می توانید کل نمونه کلاس User را که با شناسه داده شده مطابقت دارد، تزریق کنید.

ابتدا از روش روتر model برای تعیین کلاس برای یک پارامتر معین استفاده کنید. شما باید اتصالات مدل خود را در RouteServiceProvider::boot متد تعریف کنید:

اتصال یک پارامتر به یک مدل

public function boot(Router $router)
{
parent::boot($router);
 
$router->model('user', 'App\User');
}

سپس مسیری را تعریف کنید که حاوی {user} پارامتر باشد:

Route::get('profile/{user}', function(App\User $user)
{
//
});

{user} از آنجایی که پارامتر را به مدل متصل کرده ایم App\User ، یک User نمونه به مسیر تزریق می شود. بنابراین، برای مثال، یک درخواست به نمونه ای را که دارای شناسه 1 است، profile/1 تزریق می کند . User

توجه: اگر نمونه ای از مدل منطبق در پایگاه داده یافت نشد، خطای 404 پرتاب می شود.

اگر می‌خواهید رفتار "یافت نشد" خود را مشخص کنید، یک Closure را به عنوان آرگومان سوم به model متد ارسال کنید:

Route::model('user', 'User', function()
{
throw new NotFoundHttpException;
});

اگر می خواهید از منطق وضوح خود استفاده کنید، باید از Route::bind روش استفاده کنید. Closure که به bind متد ارسال می‌کنید، مقدار بخش URI را دریافت می‌کند و باید نمونه‌ای از کلاسی را که می‌خواهید به مسیر تزریق شود، برمی‌گرداند:

Route::bind('user', function($value)
{
return User::where('name', $value)->first();
});

پرتاب خطاهای 404

دو راه برای راه اندازی دستی خطای 404 از یک مسیر وجود دارد. ابتدا می توانید از abort کمک کننده استفاده کنید:

abort(404);

کمک abort کننده به سادگی a را Symfony\Component\HttpKernel\Exception\HttpException با کد وضعیت مشخص شده پرتاب می کند.

ثانیاً، می توانید به صورت دستی نمونه ای از Symfony\Component\HttpKernel\Exception\NotFoundHttpException .

اطلاعات بیشتر در مورد رسیدگی به استثناهای 404 و استفاده از پاسخ های سفارشی برای این خطاها را می توانید در بخش خطاهای مستندات بیابید .