مسیریابی
- مسیریابی پایه
- پارامترهای مسیر
- مسیرهای نامگذاری شده
- گروه های مسیر
- اتصال مدل مسیر
- مسیرهای بازگشتی
- محدود کردن نرخ
- روش جعل فرم
- دسترسی به مسیر فعلی
- اشتراک منابع متقابل (CORS)
- حافظه پنهان مسیر
مسیریابی پایه
ابتدایی ترین مسیرهای لاراول یک 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