نسخه:

مسیریابی

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

ابتدایی ترین مسیرهای لاراول یک URI و یک را می پذیرند Closure و یک روش بسیار ساده و گویا برای تعریف مسیرها ارائه می دهند:

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

فایل های مسیر پیش فرض

تمام مسیرهای لاراول در فایل های مسیر شما که در routes دایرکتوری قرار دارند تعریف شده اند. این فایل ها به صورت خودکار توسط فریمورک بارگذاری می شوند. این routes/web.php فایل مسیرهایی را تعریف می کند که برای رابط وب شما هستند. این مسیرها به web گروه میان‌افزار اختصاص داده می‌شوند که ویژگی‌هایی مانند وضعیت جلسه و حفاظت CSRF را ارائه می‌دهد. مسیرهای داخل routes/api.php بدون حالت هستند و به api گروه میان افزار اختصاص داده شده اند.

برای اکثر برنامه ها، با تعریف مسیرها در فایل خود شروع می کنید routes/web.php . مسیرهای تعریف شده در routes/web.php ممکن است با وارد کردن URL مسیر تعریف شده در مرورگر شما قابل دسترسی باشند. برای مثال، می‌توانید با پیمایش http://your-app.test/user در مرورگر خود به مسیر زیر دسترسی پیدا کنید :

Route::get('/user', 'UserController@index');

مسیرهای تعریف شده در routes/api.php فایل درون یک گروه مسیر توسط RouteServiceProvider . در این گروه، /api پیشوند URI به طور خودکار اعمال می شود، بنابراین نیازی به اعمال دستی آن در هر مسیر موجود در فایل ندارید. شما می توانید پیشوند و سایر گزینه های گروه مسیر را با تغییر RouteServiceProvider کلاس خود تغییر دهید.

روش های روتر موجود

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

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

گاهی اوقات ممکن است لازم باشد مسیری را ثبت کنید که به چندین افعال HTTP پاسخ می دهد. شما می توانید این کار را با استفاده از match روش انجام دهید. یا حتی ممکن است مسیری را ثبت کنید که با استفاده از any روش به تمام افعال HTTP پاسخ می دهد:

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

حفاظت CSRF

هر فرم HTML که به POST , PUT یا DELETE مسیرهایی که در web فایل مسیرها تعریف شده اند اشاره می کند باید دارای یک فیلد نشانه CSRF باشد. در غیر این صورت درخواست رد خواهد شد. می توانید اطلاعات بیشتری در مورد حفاظت CSRF در اسناد CSRF بخوانید :

<form method="POST" action="/profile">
@csrf
...
</form>

تغییر مسیر مسیرها

اگر مسیری را تعریف می کنید که به URI دیگری هدایت می شود، می توانید از این Route::redirect روش استفاده کنید. این روش میانبر مناسبی را فراهم می کند تا مجبور نباشید یک مسیر کامل یا کنترلر برای انجام یک تغییر مسیر ساده تعریف کنید:

Route::redirect('/here', '/there');

به طور پیش فرض، Route::redirect یک 302 کد وضعیت را برمی گرداند. می توانید کد وضعیت را با استفاده از پارامتر سوم اختیاری سفارشی کنید:

Route::redirect('/here', '/there', 301);

می توانید از Route::permanentRedirect روش برای بازگرداندن 301 کد وضعیت استفاده کنید:

Route::permanentRedirect('/here', '/there');

مشاهده مسیرها

اگر مسیر شما فقط نیاز به بازگشت یک نمای دارد، می توانید از Route::view روش استفاده کنید. مانند redirect روش، این روش یک میانبر ساده ارائه می دهد تا مجبور نباشید یک مسیر یا کنترلر کامل تعریف کنید. این view روش یک URI را به عنوان اولین آرگومان خود و یک view name را به عنوان آرگومان دوم خود می پذیرد. علاوه بر این، می‌توانید آرایه‌ای از داده‌ها را برای ارسال به view به عنوان آرگومان سوم اختیاری ارائه دهید:

Route::view('/welcome', 'welcome');
 
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

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

پارامترهای مورد نیاز

گاهی اوقات باید بخش هایی از URI را در مسیر خود ثبت کنید. به عنوان مثال، ممکن است لازم باشد شناسه یک کاربر را از URL بگیرید. شما می توانید این کار را با تعریف پارامترهای مسیر انجام دهید:

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

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

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});

پارامترهای مسیر همیشه در داخل {} پرانتز قرار می گیرند و باید از کاراکترهای الفبایی تشکیل شده باشند و ممکن است شامل یک - کاراکتر نباشند. به جای استفاده از - کاراکتر، از خط زیر ( _ ) استفاده کنید. پارامترهای مسیر بر اساس ترتیب آنها به تماس های برگشتی / کنترلرهای مسیر تزریق می شوند - نام آرگومان های پاسخ به تماس / کنترل کننده مهم نیست.

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

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

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

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

شما می توانید قالب پارامترهای مسیر خود را با استفاده از where روش در یک نمونه مسیر محدود کنید. این where متد نام پارامتر و یک عبارت منظم را می پذیرد که تعیین می کند پارامتر چگونه باید محدود شود:

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 :

/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
 
parent::boot();
}

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

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

اسلش های رو به جلو رمزگذاری شده

مولفه مسیریابی لاراول به همه کاراکترها به جز / . شما باید صراحتاً با استفاده از یک عبارت منظم شرط، اجازه دهید / که بخشی از مکان نگهدار خود باشید : where

Route::get('search/{search}', function ($search) {
return $search;
})->where('search', '.*');

اسلش های رو به جلو رمزگذاری شده فقط در آخرین بخش مسیر پشتیبانی می شوند.

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

مسیرهای نامگذاری شده امکان تولید راحت URLها یا تغییر مسیرها را برای مسیرهای خاص فراهم می کنند. شما می توانید با زنجیر کردن name متد در تعریف مسیر، نامی برای مسیر تعیین کنید :

Route::get('user/profile', function () {
//
})->name('profile');

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

Route::get('user/profile', 'UserProfileController@show')->name('profile');

ایجاد URL به مسیرهای نامگذاری شده

هنگامی که نامی را به یک مسیر مشخص اختصاص دادید، می توانید از نام مسیر هنگام ایجاد URL یا تغییر مسیرها از طریق route تابع سراسری استفاده کنید:

// Generating URLs...
$url = route('profile');
 
// Generating Redirects...
return redirect()->route('profile');

اگر مسیر نامگذاری شده پارامترها را تعریف می کند، می توانید پارامترها را به عنوان آرگومان دوم به تابع ارسال کنید route . پارامترهای داده شده به طور خودکار در موقعیت های صحیح خود در URL درج می شوند:

Route::get('user/{id}/profile', function ($id) {
//
})->name('profile');
 
$url = route('profile', ['id' => 1]);

اگر پارامترهای اضافی را در آرایه ارسال کنید، آن جفت های کلید/مقدار به طور خودکار به رشته پرس و جو URL تولید شده اضافه می شوند:

Route::get('user/{id}/profile', function ($id) {
//
})->name('profile');
 
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
 
// /user/1/profile?photos=yes

گاهی اوقات، ممکن است بخواهید مقادیر پیش‌فرض درخواستی را برای پارامترهای URL، مانند محلی فعلی، تعیین کنید. برای انجام این کار، می توانید از URL::defaults روش استفاده کنید .

بازرسی مسیر فعلی

اگر می‌خواهید تعیین کنید که آیا درخواست فعلی به یک مسیر نام‌گذاری شده هدایت شده است، می‌توانید از این named روش در یک نمونه مسیر استفاده کنید. برای مثال، می‌توانید نام مسیر فعلی را از میان‌افزار مسیر بررسی کنید:

/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->route()->named('profile')) {
//
}
 
return $next($request);
}

گروه های مسیر

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

گروه‌های تودرتو سعی می‌کنند به‌طور هوشمندانه ویژگی‌ها را با گروه والد خود «ادغام» کنند. میان‌افزار و where شرایط ادغام می‌شوند در حالی که نام‌ها، فضاهای نام و پیشوندها اضافه می‌شوند. جداکننده‌های فضای نام و اسلش‌ها در پیشوندهای URI به‌طور خودکار در صورت لزوم اضافه می‌شوند.

میان افزار

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

Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second Middleware
});
 
Route::get('user/profile', function () {
// Uses first & second Middleware
});
});

فضاهای نام

یکی دیگر از موارد استفاده رایج برای گروه های مسیر، اختصاص فضای نام PHP یکسان به گروهی از کنترلرها با استفاده از namespace روش زیر است:

Route::namespace('Admin')->group(function () {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});

به یاد داشته باشید که به طور پیش‌فرض، RouteServiceProvider فایل‌های مسیر شما را در یک گروه فضای نام شامل می‌شود و به شما امکان می‌دهد مسیرهای کنترل‌کننده را بدون تعیین App\Http\Controllers پیشوند فضای نام کامل ثبت کنید. بنابراین، شما فقط باید بخشی از فضای نام را که بعد از App\Http\Controllers فضای نام پایه قرار می گیرد، مشخص کنید.

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

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

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

برای اطمینان از دسترسی به مسیرهای ساب دامنه، باید مسیرهای ساب دامنه را قبل از ثبت مسیرهای دامنه ریشه ثبت کنید. با این کار مسیرهای دامنه ریشه از بازنویسی مسیرهای زیر دامنه که دارای مسیر URI یکسان هستند جلوگیری می کند.

پیشوندهای مسیر

این prefix روش ممکن است برای پیشوند هر مسیر در گروه با یک URI معین استفاده شود. به عنوان مثال، ممکن است بخواهید همه URI های مسیر را در گروه با پیشوند قرار دهید admin :

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

پیشوندهای نام مسیر

این name روش ممکن است برای پیشوند نام مسیر در گروه با یک رشته معین استفاده شود. برای مثال، ممکن است بخواهید همه نام مسیرهای گروه بندی شده را با پیشوند اضافه کنید admin . رشته داده شده دقیقاً همانطور که مشخص شده است به نام مسیر پیشوند داده می شود، بنابراین ما مطمئن خواهیم شد که . کاراکتر انتهایی را در پیشوند ارائه می دهیم:

Route::name('admin.')->group(function () {
Route::get('users', function () {
// Route assigned name "admin.users"...
})->name('users');
});

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

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

صحافی ضمنی

لاراول به‌طور خودکار مدل‌های Eloquent تعریف شده در مسیرها یا اقدامات کنترل‌کننده‌ای را که نام متغیرهای اشاره‌شده با نوع آن با نام بخش مسیر مطابقت دارد، حل می‌کند. مثلا:

Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});

از آنجایی که $user متغیر به‌عنوان مدل Eloquent مشخص می‌شود App\User و نام متغیر با {user} بخش URI مطابقت دارد، لاراول به‌طور خودکار نمونه‌ای از مدل را تزریق می‌کند که شناسه‌ای مطابق با مقدار مربوطه از URI درخواستی دارد. اگر یک نمونه مدل منطبق در پایگاه داده یافت نشد، یک پاسخ HTTP 404 به طور خودکار ایجاد می شود.

سفارشی کردن نام کلید

اگر می‌خواهید که binding مدل از یک ستون پایگاه داده به غیر از id هنگام بازیابی کلاس مدل معین استفاده کند، می‌توانید getRouteKeyName روش را در مدل Eloquent لغو کنید:

/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}

صحافی صریح

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

public function boot()
{
parent::boot();
 
Route::model('user', App\User::class);
}

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

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

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

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

سفارشی کردن منطق رزولوشن

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

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
parent::boot();
 
Route::bind('user', function ($value) {
return App\User::where('name', $value)->firstOrFail();
});
}

از طرف دیگر، می توانید resolveRouteBinding روش را در مدل Eloquent خود لغو کنید. این متد مقدار قطعه URI را دریافت می‌کند و باید نمونه کلاسی را که باید به مسیر تزریق شود برگرداند:

/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value)
{
return $this->where('name', $value)->firstOrFail();
}

مسیرهای بازگشتی

با استفاده از Route::fallback روش، می توانید مسیری را تعریف کنید که زمانی اجرا می شود که هیچ مسیر دیگری با درخواست ورودی مطابقت نداشته باشد. معمولاً درخواست‌های کنترل نشده به‌طور خودکار صفحه «404» را از طریق کنترل‌کننده استثنای برنامه شما ارائه می‌کنند. با این حال، از آنجایی که ممکن است fallback مسیر را در routes/web.php فایل خود تعریف کنید، تمام میان افزارهای web گروه میان افزار در مسیر اعمال می شوند. در صورت نیاز می توانید میان افزار اضافی را به این مسیر اضافه کنید:

Route::fallback(function () {
//
});

مسیر بازگشتی همیشه باید آخرین مسیری باشد که توسط برنامه شما ثبت شده است.

محدود کردن نرخ

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

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});

محدود کردن نرخ پویا

شما می توانید حداکثر درخواست پویا را بر اساس ویژگی User مدل احراز هویت شده تعیین کنید. به عنوان مثال، اگر User مدل شما دارای یک rate_limit ویژگی است، می توانید نام ویژگی را به throttle میان افزار ارسال کنید تا برای محاسبه حداکثر تعداد درخواست استفاده شود:

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
Route::get('/user', function () {
//
});
});

محدودیت‌های نرخ کاربر متمایز و تأیید شده برای مهمان

ممکن است محدودیت‌های نرخ متفاوتی را برای کاربران مهمان و احراز هویت شده تعیین کنید. برای مثال، می‌توانید حداکثر 10 درخواست در دقیقه را برای مهمانان 60 برای کاربران احراز هویت شده مشخص کنید:

Route::middleware('throttle:10|60,1')->group(function () {
//
});

همچنین می‌توانید این قابلیت را با محدودیت‌های نرخ پویا ترکیب کنید. برای مثال، اگر User مدل شما دارای یک rate_limit ویژگی باشد، می‌توانید نام ویژگی را به throttle میان‌افزار ارسال کنید تا برای محاسبه حداکثر تعداد درخواست برای کاربران احراز هویت شده استفاده شود:

Route::middleware('auth:api', 'throttle:10|rate_limit,1')->group(function () {
Route::get('/user', function () {
//
});
});

نرخ بخش های حد

به طور معمول، شما احتمالاً یک محدودیت نرخ برای کل API خود تعیین می کنید. با این حال، برنامه شما ممکن است به محدودیت‌های نرخ متفاوتی برای بخش‌های مختلف API شما نیاز داشته باشد. اگر اینطور است، باید یک نام بخش را به عنوان آرگومان سوم به میان throttle افزار ارسال کنید:

Route::middleware('auth:api')->group(function () {
Route::middleware('throttle:60,1,default')->group(function () {
Route::get('/servers', function () {
//
});
});
 
Route::middleware('throttle:60,1,deletes')->group(function () {
Route::delete('/servers/{id}', function () {
//
});
});
});

روش جعل فرم

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="{{ csrf_token() }}">
</form>

می توانید از @method دستورالعمل Blade برای تولید _method ورودی استفاده کنید:

<form action="/foo/bar" method="POST">
@method('PUT')
@csrf
</form>

دسترسی به مسیر فعلی

می‌توانید از روش‌های current ، currentRouteName و currentRouteAction روی Route نما برای دسترسی به اطلاعات مربوط به مسیر رسیدگی به درخواست ورودی استفاده کنید:

$route = Route::current();
 
$name = Route::currentRouteName();
 
$action = Route::currentRouteAction();

برای بررسی همه روش‌های قابل دسترس ، به مستندات API برای کلاس زیربنایی Route Facade و Route instance مراجعه کنید .