مقاله

ساخت route در web.php، ساخت Controller، برگرداندن view و JSON، Route Model Binding و نام‌گذاری — اولین قدم عملی بعد از نصب Laravel.

اولین Route و Controller در Laravel 12 — از URL تا پاسخ HTML

اولین Route و Controller در Laravel 12 — از URL تا پاسخ HTML

Routing ستون فقرات هر اپلیکیشن Laravel است: URL می‌آید، middleware رد می‌شود، Controller تصمیم می‌گیرد، response برمی‌گردد. قبل از Eloquent و Queue، باید این چرخه را در muscle memory داشته باشید. در این آموزش همان اولین فیچری را می‌سازیم که در هر پروژه تکرار می‌شود — لیست و نمایش یک resource ساده.

چرا Route و Controller را جدا یاد بگیریم؟

خیلی‌ها با copy از آموزش‌ها شروع می‌کنند بدون فهم lifecycle. وقتی ۴۰۴ می‌گیرید یا middleware redirect می‌دهد، بدون این پایه سرگردان می‌شوید. مستندات Routing Laravel مرجع است؛ اینجا خلاصه عملی فارسی با تجربه پروژه.

اولین route — closure

در routes/web.php:

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/hello', function () {
    return 'سلام، Laravel!';
});

با php artisan serve به /hello بروید. برای HTML از view() استفاده کنید نه echo خام.

ساخت Controller

php artisan make:controller PostController
namespace App\Http\Controllers;

class PostController extends Controller
{
    public function index()
    {
        return view('posts.index', [
            'title' => 'لیست مقالات',
        ]);
    }

    public function show(string $slug)
    {
        return view('posts.show', compact('slug'));
    }
}

اتصال route به Controller

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{slug}', [PostController::class, 'show'])->name('posts.show');

نام route برای لینک در Blade: route('posts.index')

Resource controller — CRUD استاندارد

php artisan make:controller PostController --resource --model=Post
Route::resource('posts', PostController::class);

هفت route استاندارد index/create/store/show/edit/update/destroy. اختیار با only یا except محدود کنید.

Route Model Binding

// در PostController
public function show(Post $post)
{
    return view('posts.show', ['post' => $post]);
}

// route
Route::get('/posts/{post:slug}', [PostController::class, 'show']);

Laravel خود model را از slug پیدا می‌کند — ۴۰۴ خودکار اگر نباشد.

برگرداندن JSON (شروع API)

public function index()
{
    return response()->json([
        'data' => Post::query()->latest()->limit(10)->get(),
    ]);
}

API کامل‌تر در cluster مقالات REST.

Middleware روی route

Route::middleware('auth')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
});

اشتباهات رایج

  • منطق دیتابیس سنگین در closure route
  • فراموش کردن name() و hardcode URL در Blade
  • Controller ۵۰۰ خطی — به Service بسپارید
  • عدم type-hint روی Request و Model

بهترین شیوه‌ها

Controller نازک. Form Request برای validation. Policy برای authorization. از route:list برای debug استفاده کنید — در دستورات Artisan.

جمع‌بندی

Route نقشه است، Controller راهنما. با resource + model binding الگوی ۸۰٪ CRUDهای admin و وبلاگ را پوشش می‌دهید. ساختار پوشه‌ها: راهنمای folder structure.

پروژه Laravel می‌خواهید؟ درخواست دهید.