🛣️

Routing Cơ Bản

Định nghĩa Routes

<?php
// routes/web.php

use Illuminate\Support\Facades\Route;

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

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

// Route với parameters
Route::get('/users/{id}', function (string $id) {
    return "User ID: " . $id;
});

// Optional parameters
Route::get('/posts/{slug?}', function (?string $slug = null) {
    return $slug ? "Post: $slug" : "All posts";
});

// Route constraints
Route::get('/orders/{id}', function (int $id) {
    return "Order: $id";
})->whereNumber('id');

Route::get('/categories/{slug}', function (string $slug) {
    return "Category: $slug";
})->whereAlpha('slug');

Route Groups & Prefixes

<?php
// routes/api.php

use App\Http\Controllers\Api\UserController;
use App\Http\Controllers\Api\PostController;

// API v1 group
Route::prefix('v1')->group(function () {
    Route::apiResource('users', UserController::class);
    Route::apiResource('posts', PostController::class);
});

// Authenticated routes
Route::middleware(['auth:sanctum'])->group(function () {
    Route::get('/profile', [ProfileController::class, 'show']);
    Route::put('/profile', [ProfileController::class, 'update']);
    
    // Admin routes
    Route::middleware(['admin'])->prefix('admin')->group(function () {
        Route::get('/dashboard', [AdminController::class, 'dashboard']);
        Route::resource('users', AdminUserController::class);
    });
});
🎮

Controllers

Resource Controller

# Tạo resource controller
php artisan make:controller PostController --resource

# Tạo API resource controller
php artisan make:controller Api/PostController --api
<?php
// app/Http/Controllers/PostController.php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Illuminate\Http\RedirectResponse;

class PostController extends Controller
{
    public function index(): View
    {
        $posts = Post::with('author')
            ->latest()
            ->paginate(15);
            
        return view('posts.index', compact('posts'));
    }

    public function create(): View
    {
        return view('posts.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
            'category_id' => 'required|exists:categories,id',
        ]);
        
        $post = $request->user()->posts()->create($validated);
        
        return redirect()
            ->route('posts.show', $post)
            ->with('success', 'Bài viết đã được tạo!');
    }

    public function show(Post $post): View
    {
        $post->load(['author', 'comments.user']);
        return view('posts.show', compact('post'));
    }

    public function update(Request $request, Post $post): RedirectResponse
    {
        $this->authorize('update', $post);
        
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
        ]);
        
        $post->update($validated);
        
        return redirect()
            ->route('posts.show', $post)
            ->with('success', 'Đã cập nhật!');
    }

    public function destroy(Post $post): RedirectResponse
    {
        $this->authorize('delete', $post);
        $post->delete();
        
        return redirect()
            ->route('posts.index')
            ->with('success', 'Đã xóa bài viết!');
    }
}
🔒

Middleware

Tạo Custom Middleware

php artisan make:middleware EnsureUserIsAdmin
<?php
// app/Http/Middleware/EnsureUserIsAdmin.php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureUserIsAdmin
{
    public function handle(Request $request, Closure $next): Response
    {
        if (!$request->user() || !$request->user()->is_admin) {
            abort(403, 'Unauthorized');
        }

        return $next($request);
    }
}

// Đăng ký trong bootstrap/app.php (Laravel 11+)
->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'admin' => \App\Http\Middleware\EnsureUserIsAdmin::class,
    ]);
})
💡 Laravel 11: Middleware được đăng ký trong bootstrap/app.php thay vì Kernel.php.
← Tổng quan Bài 2: Eloquent ORM →