وقتی کاربر وارد یک وبسایت میشود و آدرسی مانند /products یا /login را در مرورگر باز میکند، Laravel باید بداند این درخواست قرار است به کدام بخش از برنامه ارسال شود.
اینجاست که Route در Laravel وارد عمل میشود.
Route یا Routing وظیفه دارد مشخص کند وقتی یک درخواست HTTP با یک URL و متد مشخص به برنامه Laravel ارسال شد، چه کدی باید اجرا شود و چه پاسخی به کاربر برگردد.
برای مثال:
Route::get('/products', function () {
return 'Products';
});
در این مثال به Laravel گفتهایم:
> اگر کاربر با متد GET به آدرس /products درخواست ارسال کرد، این کد را اجرا کن.
Routing یکی از پایهایترین مفاهیم Laravel است و تقریباً هر پروژهای که با این فریمورک ساخته میشود، به Route نیاز دارد.
در این مقاله از پایه شروع میکنیم و با تعریف Route، متدهای HTTP، پارامترها، Named Route، Route Group، Middleware، Resource Route، Route Model Binding و ابزارهای مدیریت Route آشنا میشویم.
Route در Laravel چیست؟
Route مسیری است که مشخص میکند یک درخواست HTTP باید چگونه در برنامه پردازش شود.
به زبان ساده، Route بین:
URL کاربر
و
کدی که باید اجرا شود
ارتباط برقرار میکند.
برای مثال:
Route::get('/about', function () {
return 'About Us';
});
اگر کاربر وارد این آدرس شود:
https://example.com/about
Laravel Route مربوط به /about را پیدا کرده و کد مربوط به آن را اجرا میکند.
بنابراین میتوانیم Route را یکی از نقاط ورود اصلی درخواستها به برنامه Laravel در نظر بگیریم.
# Routeها در Laravel کجا قرار دارند؟
Routeها معمولاً در فایلهای مربوط به routing پروژه قرار میگیرند.
یکی از مهمترین فایلها:
routes/web.php
است.
این فایل معمولاً برای Routeهایی استفاده میشود که مربوط به رابط وب برنامه هستند.
برای مثال:
Route::get('/', function () {
return view('welcome');
});
همچنین در پروژههایی که API دارند، Routeهای API نیز میتوانند در فایل یا ساختار مربوط به API تعریف شوند.
نکته مهم این است که محل و ساختار دقیق Routeها میتواند بر اساس نسخه Laravel و تنظیمات پروژه متفاوت باشد؛ بنابراین بهتر است همیشه ساختار پروژهای که در حال کار روی آن هستید را نیز بررسی کنید.
# سادهترین Route در Laravel
برای ساخت یک Route ساده میتوانیم از Route::get() استفاده کنیم:
use Illuminate\Support\Facades\Route;
Route::get('/hello', function () {
return 'Hello Laravel';
});
حالا اگر کاربر به این آدرس مراجعه کند:
/hello
متن زیر نمایش داده میشود:
Hello Laravel
ساختار کلی Route به شکل زیر است:
Route::method('/url', function () {
// code
});
مثلاً:
Route::get('/products', function () {
return 'Product List';
});
# متدهای HTTP در Routeهای Laravel
Route فقط برای درخواستهای GET نیست.
Laravel از متدهای مختلف HTTP پشتیبانی میکند.
مهمترین آنها عبارتاند از:
| متد | کاربرد معمول |
|---|---|
| GET | دریافت اطلاعات |
| POST | ایجاد یا ارسال اطلاعات |
| PUT | جایگزینی کامل اطلاعات |
| PATCH | ویرایش بخشی از اطلاعات |
| DELETE | حذف اطلاعات |
# Route با GET
GET معمولاً برای دریافت اطلاعات استفاده میشود.
Route::get('/products', function () {
return 'Products';
});
مثلاً:
GET /products
میتواند لیست محصولات را نمایش دهد.
# Route با POST
برای دریافت اطلاعات ارسالشده توسط کاربر میتوانیم از POST استفاده کنیم:
Route::post('/products', function () {
return 'Product Created';
});
برای مثال فرم ایجاد محصول میتواند اطلاعات را به این Route ارسال کند.
POST /products
# Route با PUT
PUT معمولاً برای بهروزرسانی کامل یک منبع استفاده میشود:
Route::put('/products/{id}', function ($id) {
return "Product {$id} Updated";
});
# Route با PATCH
PATCH معمولاً برای بهروزرسانی بخشی از اطلاعات استفاده میشود:
Route::patch('/products/{id}', function ($id) {
return "Product {$id} Updated";
});
# Route با DELETE
برای حذف یک منبع:
Route::delete('/products/{id}', function ($id) {
return "Product {$id} Deleted";
});
# تفاوت GET، POST، PUT، PATCH و DELETE
بهصورت ساده میتوان این متدها را اینگونه در ذهن نگه داشت:
GET → دریافت
POST → ایجاد
PUT → جایگزینی/ویرایش کامل
PATCH → ویرایش بخشی
DELETE → حذف
در پروژههای واقعی، انتخاب متد مناسب باعث میشود ساختار API و برنامه منظمتر و قابل فهمتر باشد.
# Route و Controller چه ارتباطی دارند؟
در مثالهای ساده میتوانیم منطق را مستقیماً داخل Route بنویسیم:
Route::get('/products', function () {
return 'Products';
});
اما در پروژههای واقعی بهتر است منطق اصلی برنامه را داخل Controller قرار دهیم.
مثلاً:
Route::get('/products', [ProductController::class, 'index']);
در این حالت:
Request
↓
Route
↓
ProductController
↓
Response
Route فقط مشخص میکند درخواست باید به کدام Controller و متد ارسال شود.
این روش مخصوصاً در پروژههای بزرگ اهمیت زیادی دارد.
در مقاله بعدی کلاستر با Controller در Laravel دقیقاً همین موضوع را بررسی خواهیم کرد.
# تعریف Route با Controller
ابتدا Controller را ایجاد میکنیم:
php artisan make:controller ProductController
سپس Route را تعریف میکنیم:
use App\Http\Controllers\ProductController;
Route::get('/products', [ProductController::class, 'index']);
حالا میتوانیم در Controller بنویسیم:
public function index()
{
return 'Products';
}
در نتیجه وقتی کاربر وارد /products شود، متد index() اجرا خواهد شد.
# Route Parameter چیست؟
گاهی URL باید شامل یک مقدار متغیر باشد.
مثلاً برای نمایش محصول شماره 15:
/products/15
میتوانیم Route زیر را تعریف کنیم:
Route::get('/products/{id}', function ($id) {
return "Product ID: {$id}";
});
قسمت:
{id}
یک Route Parameter است.
اگر کاربر وارد:
/products/15
شود، مقدار $id برابر با 15 خواهد بود.
# چند Route Parameter
یک Route میتواند چند پارامتر داشته باشد.
مثلاً:
Route::get('/users/{user}/posts/{post}', function ($user, $post) {
return "User: {$user}, Post: {$post}";
});
در این حالت URL میتواند چنین باشد:
/users/10/posts/25
و مقدارها به شکل زیر دریافت میشوند:
$user = 10;
$post = 25;
# پارامتر اختیاری در Route
گاهی وجود یک پارامتر اجباری نیست.
برای ساخت پارامتر اختیاری از ? استفاده میکنیم:
Route::get('/user/{name?}', function ($name = null) {
return $name ?? 'Guest';
});
در این حالت هر دو URL قابل استفاده هستند:
/user
و:
/user/Saeed
اگر نام ارسال نشود، مقدار $name برابر null خواهد بود.
# محدود کردن Route Parameter با where
فرض کنید میخواهیم id فقط عدد باشد.
میتوانیم Route را محدود کنیم:
Route::get('/products/{id}', function ($id) {
return $id;
})->where('id', '[0-9]+');
حالا Route فقط مقادیر عددی را قبول میکند.
برای مثال:
/products/15
معتبر است.
اما:
/products/abc
مطابق این محدودیت نخواهد بود.
# Named Route چیست؟
در پروژههای بزرگ، استفاده مستقیم از URLها در همه جای برنامه میتواند مدیریت لینکها را سخت کند.
Laravel امکان نامگذاری Routeها را فراهم میکند.
مثلاً:
Route::get('/products', function () {
return 'Products';
})->name('products.index');
حالا Route ما نام زیر را دارد:
products.index
# ساخت URL با Named Route
بهجای اینکه URL را مستقیماً بنویسیم:
/products
میتوانیم از نام Route استفاده کنیم:
route('products.index')
مثلاً:
<a href="{{ route('products.index') }}">
Products
</a>
مزیت این روش این است که اگر بعداً URL را تغییر دهیم، در بسیاری از قسمتهای برنامه لازم نیست همه لینکها را بهصورت دستی تغییر دهیم.
# Named Route با Parameter
فرض کنیم Route زیر را داریم:
Route::get('/products/{id}', function ($id) {
return $id;
})->name('products.show');
برای ساخت URL میتوانیم بنویسیم:
route('products.show', ['id' => 15])
که URL متناظر را ایجاد میکند.
# Redirect در Route
گاهی لازم است کاربر را از یک URL به URL دیگری منتقل کنیم.
برای این کار میتوانیم از redirect استفاده کنیم:
Route::redirect('/old-page', '/new-page');
یعنی:
/old-page
به:
/new-page
هدایت میشود.
# Route Group چیست؟
وقتی چند Route ویژگی مشترکی دارند، میتوانیم آنها را داخل یک گروه قرار دهیم.
برای مثال اگر چند Route مربوط به بخش Admin باشند، میتوانیم برای همه آنها یک Prefix تعریف کنیم.
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
return 'Users';
});
Route::get('/products', function () {
return 'Products';
});
});
حالا URLها خواهند بود:
/admin/users
/admin/products
# Route Group با Middleware
یکی از کاربردهای بسیار مهم Route Group، اعمال Middleware مشترک است.
مثلاً:
Route::middleware(['auth'])->group(function () {
Route::get('/profile', function () {
return 'Profile';
});
Route::get('/orders', function () {
return 'Orders';
});
});
در این حالت Routeهای داخل گروه تحت Middleware موردنظر قرار میگیرند.
این روش برای بخشهایی مانند:
- پنل مدیریت
- حساب کاربری
- سفارشها
- تنظیمات
- صفحات خصوصی
بسیار کاربردی است.
# Route Group با Prefix و Name
میتوانیم چند ویژگی را همزمان روی یک گروه اعمال کنیم.
برای مثال:
Route::prefix('admin')
->name('admin.')
->group(function () {
Route::get('/users', function () {
return 'Users';
})->name('users');
Route::get('/products', function () {
return 'Products';
})->name('products');
});
در این حالت نام Routeها به شکل زیر خواهند بود:
admin.users
admin.products
و URLها:
/admin/users
/admin/products
این ساختار در پروژههای بزرگ بسیار مفید است.
# Resource Route در Laravel
یکی از امکانات بسیار کاربردی Laravel، Resource Route است.
فرض کنید برای یک Product عملیات CRUD داریم:
List
Create
Store
Show
Edit
Update
Delete
بهجای اینکه همه Routeها را دستی تعریف کنیم، میتوانیم از:
Route::resource('products', ProductController::class);
استفاده کنیم.
Laravel مجموعهای از Routeهای استاندارد مربوط به Resource را برای ما تعریف میکند.
ساختار معمول آنها:
| عملیات | متد | URL |
|---|---|---|
| index | GET | /products |
| create | GET | /products/create |
| store | POST | /products |
| show | GET | /products/{product} |
| edit | GET | /products/{product}/edit |
| update | PUT/PATCH | /products/{product} |
| destroy | DELETE | /products/{product} |
این ویژگی برای ساخت CRUD بسیار کاربردی است.
# Route Model Binding چیست؟
یکی از امکانات مهم Laravel، Route Model Binding است.
فرض کنیم Route زیر را داریم:
Route::get('/products/{product}', function (Product $product) {
return $product;
});
Laravel میتواند بر اساس پارامتر Route، مدل مربوطه را پیدا کند و آن را به متد منتقل کند.
در نتیجه بهجای اینکه خودمان:
$product = Product::findOrFail($id);
را در هر Route بنویسیم، Laravel میتواند این فرآیند را مدیریت کند.
در Controller نیز همین مفهوم قابل استفاده است:
public function show(Product $product)
{
return view('products.show', compact('product'));
}
این قابلیت باعث سادهتر و تمیزتر شدن کدهای CRUD میشود.
# Fallback Route چیست؟
گاهی میخواهیم اگر هیچ Route دیگری با درخواست کاربر مطابقت نداشت، یک پاسخ مشخص نمایش داده شود.
برای این کار میتوان از Fallback استفاده کرد:
Route::fallback(function () {
return 'Page Not Found';
});
البته در پروژههای واقعی معمولاً بهتر است صفحه خطای مناسب و حرفهای برای وضعیت 404 طراحی شود.
# مشاهده لیست Routeهای Laravel
یکی از کاربردیترین دستورات Artisan برای مدیریت Routeها:
php artisan route:list
است.
این دستور اطلاعات Routeهای ثبتشده را نمایش میدهد.
برای مثال میتوانیم اطلاعاتی مانند:
GET /
GET products
POST products
GET products/{product}
را مشاهده کنیم.
اگر در پروژهای Route کار نمیکند، یکی از اولین ابزارهایی که باید بررسی کنیم همین دستور است.
# فیلتر کردن Routeها
در پروژههای بزرگ ممکن است تعداد Routeها زیاد باشد.
در چنین شرایطی میتوانیم از امکانات فیلتر و نمایش محدودشده route:list متناسب با نسخه و تنظیمات Laravel استفاده کنیم.
برای مثال میتوان Routeهای مربوط به یک بخش خاص را راحتتر بررسی کرد.
این کار هنگام Debug کردن پروژه بسیار مفید است.
# Route Cache چیست؟
Laravel امکان Cache کردن Routeها را برای محیطهای مناسب فراهم میکند.
دستور مربوط به آن:
php artisan route:cache
است.
برای پاک کردن Route Cache:
php artisan route:clear
در محیط توسعه معمولاً نیازی نیست بدون دلیل Routeها را Cache کنیم؛ اما در استقرار Production میتوان از قابلیتهای Cache لاراول برای بهبود فرآیند بارگذاری استفاده کرد.
# Routeهای وب و API چه تفاوتی دارند؟
در یک پروژه Laravel ممکن است هم صفحات وب داشته باشیم و هم API.
برای مثال:
Web:
GET /products
ممکن است یک صفحه HTML را نمایش دهد.
در مقابل API میتواند چیزی شبیه:
GET /api/products
باشد و داده را در قالب JSON برگرداند.
مثلاً:
{
"id": 1,
"name": "Laptop"
}
بنابراین باید بین نیازهای صفحات وب و API تفاوت قائل شویم.
در مقالات بعدی این کلاستر، موضوع ساخت REST API و API Resource را بهصورت جداگانه بررسی خواهیم کرد.
# یک مثال عملی: Routeهای سیستم فروشگاه
فرض کنیم یک فروشگاه اینترنتی داریم.
میتوانیم Routeهای مختلفی مانند موارد زیر داشته باشیم:
Route::get('/products', [ProductController::class, 'index'])
->name('products.index');
Route::get('/products/{product}', [ProductController::class, 'show'])
->name('products.show');
Route::get('/products/create', [ProductController::class, 'create'])
->name('products.create');
Route::post('/products', [ProductController::class, 'store'])
->name('products.store');
Route::get('/products/{product}/edit', [ProductController::class, 'edit'])
->name('products.edit');
Route::put('/products/{product}', [ProductController::class, 'update'])
->name('products.update');
Route::delete('/products/{product}', [ProductController::class, 'destroy'])
->name('products.destroy');
اما چون این ساختار یک CRUD استاندارد است، میتوانیم آن را سادهتر کنیم:
Route::resource('products', ProductController::class);
این یکی از دلایلی است که شناخت امکانات Routing در Laravel میتواند حجم کد پروژه را کاهش دهد.
# ترتیب Routeها چرا مهم است؟
یکی از اشتباهات رایج هنگام کار با Routeها، بیتوجهی به ترتیب Routeها است.
برای مثال:
Route::get('/products/{product}', ...);
Route::get('/products/create', ...);
در چنین ساختاری ممکن است عبارت:
create
بهعنوان مقدار {product} در نظر گرفته شود.
بنابراین در مواردی که Routeهای ثابت و پارامتری با یکدیگر تداخل دارند، باید ترتیب و ساختار Routeها را با دقت بررسی کرد.
برای مثال بهتر است Route مربوط به:
/products/create
قبل از Route پارامتری مربوط به:
/products/{product}
تعریف شود.
# اشتباهات رایج در Routeهای Laravel
1. استفاده از متد HTTP اشتباه
اگر Route به شکل:
Route::post('/products', ...);
تعریف شده باشد، ارسال GET به آن همان Route را اجرا نمیکند.
2. اشتباه در نام Route
اگر Route این نام را داشته باشد:
->name('products.index')
اما در View بنویسیم:
route('product.index')
با خطا مواجه خواهیم شد.
3. اشتباه در نام Parameter
اگر بنویسیم:
Route::get('/products/{product}', ...);
باید در جاهایی که نام پارامتر اهمیت دارد، همان ساختار را رعایت کنیم.
4. تعریف Route تکراری
اگر چند Route مشابه تعریف کنیم، ممکن است یکی از آنها عملاً مورد استفاده قرار نگیرد یا رفتار غیرمنتظرهای ایجاد شود.
5. قرار دادن منطق زیاد داخل Route
برای مثال این کار در پروژه کوچک قابل قبول است:
Route::get('/hello', function () {
return 'Hello';
});
اما قرار دادن منطق پیچیده کسبوکار داخل Route باعث شلوغ و سختشدن کد میشود.
بهتر است منطق را به Controller، Service و بخشهای مناسب معماری برنامه منتقل کنیم.
# بهترین روش برای ساخت Route در پروژههای واقعی
برای پروژههای کوچک میتوان Routeهای ساده داشت:
Route::get('/about', function () {
return view('about');
});
اما در پروژههای بزرگتر بهتر است معماری منظمتری داشته باشیم:
Route
↓
Middleware
↓
Controller
↓
Service / Business Logic
↓
Model
↓
Database
↓
Response
Route باید تا حد امکان مسئولیت محدودی داشته باشد.
یعنی بیشتر وظیفه آن تعیین مسیر درخواست باشد، نه اجرای تمام منطق برنامه.
# جمعبندی Route در Laravel
Route یکی از مهمترین مفاهیم Laravel است و مشخص میکند درخواستهای HTTP چگونه وارد برنامه شوند و به کدام بخش از برنامه منتقل شوند.
در این مقاله با مفاهیم مهمی مانند موارد زیر آشنا شدیم:
- Route چیست؟
- فایلهای Route در Laravel
- Routeهای GET
- Routeهای POST
- PUT و PATCH
- DELETE
- Route Parameter
- Optional Parameter
- محدود کردن Parameter با
where - Named Route
- ساخت URL با
route() - Redirect
- Route Group
- Prefix
- Name Prefix
- Middleware در Route
- Resource Route
- Route Model Binding
- Fallback Route
php artisan route:list- Route Cache
- تفاوت Routeهای Web و API
- خطاهای رایج Routing
- ساخت Routeهای CRUD
اگر Route را بهخوبی یاد بگیرید، قدم بعدی این است که بدانید بعد از دریافت درخواست، Laravel چگونه منطق برنامه را به Controller منتقل میکند.
به همین دلیل مقاله بعدی این کلاستر به Controller در Laravel اختصاص دارد.
# سوالات متداول
Route در Laravel چیست؟
Route مشخص میکند یک درخواست HTTP با URL و متد مشخص باید به کدام بخش از برنامه Laravel ارسال شود.
Routeهای Laravel کجا قرار دارند؟
Routeهای وب معمولاً در ساختار routes و بهخصوص routes/web.php تعریف میشوند. Routeهای API نیز در ساختار مربوط به API پروژه قرار میگیرند.
چگونه یک Route ساده در Laravel بسازیم؟
مثلاً:
Route::get('/hello', function () {
return 'Hello Laravel';
});
Named Route چیست؟
Named Route به یک Route نام مشخص میدهد تا بتوانیم در بخشهای مختلف برنامه بهجای URL مستقیم، از نام Route استفاده کنیم.
مثلاً:
Route::get('/products', ...)
->name('products.index');
و سپس:
route('products.index')
Route Resource چه کاربردی دارد؟
Route::resource() برای ساخت مجموعه Routeهای استاندارد CRUD مربوط به یک Resource استفاده میشود و نیاز به تعریف دستی تمام Routeهای CRUD را کاهش میدهد.
Route Model Binding چیست؟
قابلیتی در Laravel است که اجازه میدهد پارامترهای Route به مدلهای Eloquent متصل شوند تا پیدا کردن رکورد مربوطه سادهتر شود.
چگونه Routeهای Laravel را مشاهده کنیم؟
با دستور:
php artisan route:list
میتوان Routeهای ثبتشده را بررسی کرد.
آیا میتوان Middleware را روی Route قرار داد؟
بله. میتوان Middleware را روی یک Route یا گروهی از Routeها اعمال کرد:
Route::middleware(['auth'])->group(function () {
// routes
});
آیا میتوان چند Route را در یک گروه قرار داد؟
بله. Route Group برای اعمال تنظیمات مشترک مانند Middleware، Prefix و Name Prefix بسیار کاربردی است.
آیا باید تمام منطق برنامه را داخل Route بنویسیم؟
خیر. در پروژههای واقعی بهتر است Route مسئول مسیریابی باشد و منطق برنامه در Controller، Service و سایر لایههای مناسب قرار گیرد.





