نسخه:

مسیریابی

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

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

use Illuminate\Support\Facades\Route;
 
Route::get('/greeting', function () {
return 'Hello World';
});

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

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

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

use App\Http\Controllers\UserController;
 
Route::get('/user', [UserController::class, 'index']);

مسیرهای API

اگر برنامه شما یک API بدون حالت نیز ارائه می دهد، می توانید مسیریابی API را با استفاده از install:api دستور Artisan فعال کنید:

php artisan install:api

این install:api دستور Laravel Sanctum را نصب می‌کند که یک محافظ احراز هویت توکن API قوی و در عین حال ساده ارائه می‌کند که می‌تواند برای احراز هویت مصرف‌کنندگان API شخص ثالث، SPA یا برنامه‌های تلفن همراه استفاده شود. علاوه بر این، install:api دستور فایل را ایجاد می کند routes/api.php :

Route::get('/user', function (Request $request) {
return $request->user();
})->middleware(Authenticate::using('sanctum'));

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

->withRouting(
api: __DIR__.'/../routes/api.php',
apiPrefix: 'api/admin',
// ...
)

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

روتر به شما امکان می دهد مسیرهایی را ثبت کنید که به هر فعل 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 () {
// ...
});

هنگام تعریف چندین مسیر که URI یکسانی دارند، مسیرهایی که از متدهای get , post , put , patch , delete و استفاده می کنند باید قبل از مسیرهایی که از , و متدها options استفاده می کنند تعریف شوند . این تضمین می کند که درخواست دریافتی با مسیر صحیح مطابقت دارد. any match redirect

تزریق وابستگی

می‌توانید وابستگی‌های مورد نیاز مسیرتان را در امضای برگشت تماس مسیرتان تایپ کنید. وابستگی های اعلام شده به طور خودکار توسط کانتینر سرویس لاراول حل شده و به callback تزریق می شوند . به عنوان مثال، می‌توانید کلاس را تایپ کنید Illuminate\Http\Request تا درخواست HTTP فعلی به طور خودکار به پاسخ تماس مسیر شما تزریق شود:

use Illuminate\Http\Request;
 
Route::get('/users', function (Request $request) {
// ...
});

حفاظت CSRF

به یاد داشته باشید، هر فرم HTML که به POST , PUT , PATCH یا 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');

هنگام استفاده از پارامترهای مسیر در مسیرهای تغییر مسیر، پارامترهای زیر توسط لاراول رزرو شده و قابل استفاده نیستند: destination و status .

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

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

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

هنگام استفاده از پارامترهای مسیر در مسیرهای نمایش، پارامترهای زیر توسط لاراول رزرو شده و قابل استفاده نیستند: view , data , status , و headers .

فهرست کردن مسیرهای شما

دستور route:list Artisan به راحتی می تواند یک نمای کلی از تمام مسیرهایی که توسط برنامه شما تعریف شده اند ارائه دهد:

php artisan route:list

به طور پیش فرض، میان افزار مسیری که به هر مسیر اختصاص داده شده است، در خروجی نمایش داده نمی شود route:list . با این حال، می‌توانید با افزودن این -v گزینه به دستور ، به لاراول دستور دهید تا نام‌های گروه میان‌افزار و میان‌افزار مسیر را نمایش دهد :

php artisan route:list -v
 
# Expand middleware groups...
php artisan route:list -vv

همچنین می‌توانید به لاراول دستور دهید فقط مسیرهایی را نشان دهد که با یک URI مشخص شروع می‌شوند:

php artisan route:list --path=api

علاوه بر این، می‌توانید به لاراول دستور دهید تا مسیرهایی را که توسط بسته‌های شخص ثالث تعریف شده‌اند، با ارائه این --except-vendor گزینه در هنگام اجرای route:list دستور مخفی کند:

php artisan route:list --except-vendor

به همین ترتیب، همچنین می‌توانید به لاراول دستور دهید که فقط مسیرهایی را نشان دهد که توسط بسته‌های شخص ثالث تعریف شده‌اند، با ارائه این --only-vendor گزینه هنگام اجرای route:list دستور:

php artisan route:list --only-vendor

سفارشی سازی مسیریابی

به طور پیش فرض، مسیرهای برنامه شما توسط bootstrap/app.php فایل پیکربندی و بارگذاری می شوند:

<?php
 
use Illuminate\Foundation\Application;
 
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)->create();

با این حال، گاهی اوقات ممکن است بخواهید یک فایل کاملاً جدید تعریف کنید که حاوی زیرمجموعه ای از مسیرهای برنامه شما باشد. برای انجام این کار، ممکن است then روش بسته شود withRouting . در این بسته شدن، می‌توانید هر مسیر دیگری را که برای برنامه شما ضروری است ثبت کنید:

use Illuminate\Support\Facades\Route;
 
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function () {
Route::middleware('api')
->prefix('webhooks')
->name('webhooks.')
->group(base_path('routes/webhooks.php'));
},
)

یا حتی ممکن است با ارائه یک using بسته به withRouting روش، کنترل کاملی بر ثبت مسیر در دست بگیرید. هنگامی که این آرگومان ارسال می شود، هیچ مسیر HTTP توسط فریمورک ثبت نمی شود و شما مسئول ثبت دستی همه مسیرها هستید:

use Illuminate\Support\Facades\Route;
 
->withRouting(
commands: __DIR__.'/../routes/console.php',
using: function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
 
Route::middleware('web')
->group(base_path('routes/web.php'));
},
)

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

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

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

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

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

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

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

پارامترها و تزریق وابستگی

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

use Illuminate\Http\Request;
 
Route::get('/user/{id}', function (Request $request, string $id) {
return 'User '.$id;
});

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

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

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

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

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

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

برای راحتی، برخی از الگوهای عبارت منظم که معمولاً مورد استفاده قرار می‌گیرند، روش‌های کمکی دارند که به شما امکان می‌دهند به سرعت محدودیت‌های الگو را به مسیرهای خود اضافه کنید:

Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->whereNumber('id')->whereAlpha('name');
 
Route::get('/user/{name}', function (string $name) {
// ...
})->whereAlphaNumeric('name');
 
Route::get('/user/{id}', function (string $id) {
// ...
})->whereUuid('id');
 
Route::get('/user/{id}', function (string $id) {
//
})->whereUlid('id');
 
Route::get('/category/{category}', function (string $category) {
// ...
})->whereIn('category', ['movie', 'song', 'painting']);

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

محدودیت های جهانی

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

use Illuminate\Support\Facades\Route;
 
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Route::pattern('id', '[0-9]+');
}

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

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

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

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

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

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

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

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

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

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

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

نام مسیرها باید همیشه منحصر به فرد باشد.

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

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

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

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

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

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

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

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

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

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

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

گروه های مسیر

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

گروه‌های تودرتو سعی می‌کنند به‌طور هوشمندانه ویژگی‌ها را با گروه والد خود «ادغام» کنند. میان‌افزار و 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...
});
});

کنترل کننده ها

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

use App\Http\Controllers\OrderController;
 
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});

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

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

Route::domain('{account}.example.com')->group(function () {
Route::get('user/{id}', function (string $account, string $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 تعریف شده در مسیرها یا اقدامات کنترل‌کننده‌ای را که نام متغیرهای اشاره‌شده با نوع آن با نام بخش مسیر مطابقت دارد، حل می‌کند. مثلا:

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

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

البته هنگام استفاده از روش های کنترل کننده، اتصال ضمنی نیز امکان پذیر است. مجدداً، توجه داشته باشید که {user} بخش URI با $user متغیر موجود در کنترلر که حاوی یک App\Models\User نوع اشاره است مطابقت دارد:

use App\Http\Controllers\UserController;
use App\Models\User;
 
// Route definition...
Route::get('/users/{user}', [UserController::class, 'show']);
 
// Controller method definition...
public function show(User $user)
{
return view('user.profile', ['user' => $user]);
}

مدل های نرم حذف شده

به طور معمول، اتصال مدل ضمنی مدل هایی را که به نرمی حذف شده اند بازیابی نمی کند . با این حال، می‌توانید با زنجیر کردن withTrashed متد به تعریف مسیر خود، پیوند ضمنی را برای بازیابی این مدل‌ها دستور دهید :

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

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

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

use App\Models\Post;
 
Route::get('/posts/{post:slug}', function (Post $post) {
return $post;
});

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

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

کلیدهای سفارشی و محدوده

هنگامی که به طور ضمنی چندین مدل Eloquent را در یک تعریف یک مسیر متصل می‌کنید، ممکن است بخواهید دامنه مدل Eloquent دوم را به گونه‌ای تنظیم کنید که باید فرزند مدل Eloquent قبلی باشد. به عنوان مثال، این تعریف مسیر را در نظر بگیرید که یک پست وبلاگ را توسط اسلاگ برای یک کاربر خاص بازیابی می کند:

use App\Models\Post;
use App\Models\User;
 
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});

هنگام استفاده از یک اتصال ضمنی با کلید سفارشی به عنوان پارامتر مسیر تودرتو، لاراول به طور خودکار محدوده پرس و جو را برای بازیابی مدل تودرتو توسط والد خود با استفاده از قراردادها برای حدس زدن نام رابطه روی والد، بررسی می کند. در این حالت، فرض می شود که User مدل دارای رابطه ای به نام posts (شکل جمع نام پارامتر مسیر) است که می تواند برای بازیابی Post مدل استفاده شود.

در صورت تمایل، می‌توانید به لاراول دستور دهید تا محدوده اتصالات «کودک» را حتی زمانی که یک کلید سفارشی ارائه نمی‌شود، انجام دهد. برای انجام این کار، می توانید scopeBindings در هنگام تعریف مسیر خود از روش استفاده کنید:

use App\Models\Post;
use App\Models\User;
 
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();

یا، ممکن است به یک گروه کامل از تعاریف مسیر دستور دهید تا از اتصالات محدوده استفاده کنند:

Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});

به طور مشابه، می‌توانید به صراحت به لاراول دستور دهید که با فراخوانی withoutScopedBindings متد، محدودیت‌ها را محدود نکند:

Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
})->withoutScopedBindings();

سفارشی کردن رفتار مدل گمشده

به طور معمول، اگر یک مدل به طور ضمنی پیدا نشود، یک پاسخ HTTP 404 ایجاد می شود. با این حال، می توانید این رفتار را با فراخوانی missing روش هنگام تعریف مسیر خود سفارشی کنید. این missing روش بسته‌ای را می‌پذیرد که اگر یک مدل به طور ضمنی پیدا نشود، فراخوانی می‌شود:

use App\Http\Controllers\LocationsController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
 
Route::get('/locations/{location:slug}', [LocationsController::class, 'show'])
->name('locations.view')
->missing(function (Request $request) {
return Redirect::route('locations.index');
});

ضمنی Enum Binding

PHP 8.1 پشتیبانی از Enums را معرفی کرد . برای تکمیل این ویژگی، لاراول به شما این امکان را می‌دهد تا یک Enum با پشتوانه رشته‌ای را در تعریف مسیر خود تایپ کنید و لاراول تنها در صورتی مسیر را فراخوانی می‌کند که آن بخش مسیر با مقدار Enum معتبر مطابقت داشته باشد. در غیر این صورت، پاسخ 404 HTTP به طور خودکار برگردانده می شود. به عنوان مثال، با توجه به Enum زیر:

<?php
 
namespace App\Enums;
 
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}

می توانید مسیری را تعریف کنید که فقط در صورتی فراخوانی شود که {category} بخش مسیر fruits یا people . در غیر این صورت، لاراول یک پاسخ 404 HTTP را برمی‌گرداند:

use App\Enums\Category;
use Illuminate\Support\Facades\Route;
 
Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});

صحافی صریح

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

use App\Models\User;
use Illuminate\Support\Facades\Route;
 
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Route::model('user', User::class);
}

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

use App\Models\User;
 
Route::get('/users/{user}', function (User $user) {
// ...
});

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

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

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

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

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

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

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

اگر مسیری از محدوده بندی الزام آور ضمنی استفاده می کند ، از resolveChildRouteBinding روش برای حل و فصل اتصال فرزند مدل والد استفاده می شود:

/**
* Retrieve the child model for a bound value.
*
* @param string $childType
* @param mixed $value
* @param string|null $field
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveChildRouteBinding($childType, $value, $field)
{
return parent::resolveChildRouteBinding($childType, $value, $field);
}

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

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

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

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

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

تعریف محدود کننده های نرخ

لاراول شامل خدمات محدود کننده نرخ قدرتمند و قابل تنظیمی است که می توانید از آنها برای محدود کردن میزان ترافیک برای یک مسیر یا گروهی از مسیرها استفاده کنید. برای شروع، باید تنظیمات محدود کننده نرخ را تعریف کنید که نیازهای برنامه شما را برآورده کند.

boot محدود کننده های نرخ ممکن است در متد کلاس برنامه شما تعریف شوند App\Providers\AppServiceProvider :

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
 
/**
* Bootstrap any application services.
*/
protected function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}

محدود کننده های نرخ با استفاده از روش RateLimiter نما تعریف می شوند for . این for روش یک نام محدود کننده نرخ و یک بسته را می پذیرد که پیکربندی حدی را که باید برای مسیرهایی که به محدود کننده نرخ اختصاص داده شده اعمال شود، برمی گرداند. پیکربندی محدودیت نمونه هایی از Illuminate\Cache\RateLimiting\Limit کلاس هستند. این کلاس حاوی متدهای سازنده مفیدی است تا بتوانید به سرعت حد خود را تعیین کنید. نام محدود کننده نرخ ممکن است هر رشته ای باشد که می خواهید:

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
 
/**
* Bootstrap any application services.
*/
protected function boot(): void
{
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000);
});
}

اگر درخواست دریافتی از محدودیت نرخ تعیین شده بیشتر شود، پاسخی با کد وضعیت HTTP 429 به طور خودکار توسط لاراول برگردانده می شود. اگر می خواهید پاسخ خود را تعریف کنید که باید با یک محدودیت نرخ برگردانده شود، می توانید از response روش استفاده کنید:

RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000)->response(function (Request $request, array $headers) {
return response('Custom response...', 429, $headers);
});
});

از آنجایی که تماس‌های محدودکننده نرخ نمونه درخواست HTTP ورودی را دریافت می‌کنند، می‌توانید محدودیت نرخ مناسب را به صورت پویا بر اساس درخواست ورودی یا کاربر تأیید شده ایجاد کنید:

RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100);
});

تقسیم بندی محدودیت های نرخ

گاهی اوقات ممکن است بخواهید محدودیت های نرخ را با مقدار دلخواه تقسیم کنید. به عنوان مثال، ممکن است بخواهید به کاربران اجازه دهید به ازای هر آدرس IP ۱۰۰ بار در دقیقه به یک مسیر معین دسترسی داشته باشند. برای انجام این کار، by هنگام ایجاد محدودیت نرخ می توانید از روش زیر استفاده کنید :

RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100)->by($request->ip());
});

برای نشان دادن این ویژگی با استفاده از مثالی دیگر، می‌توانیم دسترسی به مسیر را به 100 بار در دقیقه به ازای هر شناسه کاربری احراز هویت شده یا 10 بار در دقیقه در هر آدرس IP برای مهمانان محدود کنیم:

RateLimiter::for('uploads', function (Request $request) {
return $request->user()
? Limit::perMinute(100)->by($request->user()->id)
: Limit::perMinute(10)->by($request->ip());
});

محدودیت های چندگانه نرخ

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

RateLimiter::for('login', function (Request $request) {
return [
Limit::perMinute(500),
Limit::perMinute(3)->by($request->input('email')),
];
});

اتصال محدود کننده های نرخ به مسیرها

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

Route::middleware(['throttle:uploads'])->group(function () {
Route::post('/audio', function () {
// ...
});
 
Route::post('/video', function () {
// ...
});
});

درنگ با ردیس

به طور پیش فرض، throttle میان افزار به Illuminate\Routing\Middleware\ThrottleRequests کلاس نگاشت می شود. با این حال، اگر از Redis به عنوان درایور کش برنامه خود استفاده می کنید، ممکن است بخواهید به لاراول دستور دهید از Redis برای مدیریت محدودیت نرخ استفاده کند. برای این کار باید از throttleWithRedis روش موجود در فایل اپلیکیشن خود استفاده کنید bootstrap/app.php . این روش throttle میان افزار را به Illuminate\Routing\Middleware\ThrottleRequestsWithRedis کلاس میان افزار نگاشت می کند:

->withMiddleware(function (Middleware $middleware) {
$middleware->throttleWithRedis();
// ...
})

روش جعل فرم

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

<form action="/example" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

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

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

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

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

use Illuminate\Support\Facades\Route;
 
$route = Route::current(); // Illuminate\Routing\Route
$name = Route::currentRouteName(); // string
$action = Route::currentRouteAction(); // string

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

اشتراک منابع متقابل (CORS)

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

گاهی اوقات، ممکن است لازم باشد مقادیر پیکربندی CORS را برای برنامه خود سفارشی کنید. می توانید این کار را با انتشار cors فایل پیکربندی با استفاده از config:publish دستور Artisan انجام دهید:

php artisan config:publish cors

این دستور یک cors.php فایل پیکربندی را در دایرکتوری برنامه شما قرار می دهد config .

برای اطلاعات بیشتر در مورد سرصفحه های CORS و CORS، لطفاً به مستندات وب MDN در مورد CORS مراجعه کنید .

حافظه پنهان مسیر

هنگام استقرار برنامه خود در تولید، باید از کش مسیر لاراول استفاده کنید. استفاده از کش مسیر، مدت زمان ثبت تمام مسیرهای برنامه شما را به شدت کاهش می دهد. برای ایجاد کش مسیر، route:cache دستور Artisan را اجرا کنید:

php artisan route:cache

پس از اجرای این دستور، فایل routes ذخیره شده شما در هر درخواست بارگذاری می شود. به یاد داشته باشید، اگر مسیرهای جدیدی اضافه کنید، باید یک مسیر کش جدید ایجاد کنید. به همین دلیل، شما باید route:cache دستور را فقط در حین استقرار پروژه خود اجرا کنید.

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

php artisan route:clear