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