PHP / LARAVEL // LARAVELD::01 BAŞLANGIÇ
12m READCOMPLETION: 89%ID::PHP-101

LARAVEL ROUTING VE MVC MİMARİSİ

Laravel MVC yapısı, route tanımları ve controller organizasyonu

Laravel, PHP ekosisteminin en popüler full-stack web framework'üdür. MVC (Model-View-Controller) mimarisi üzerine kurulu olan Laravel, geliştiricilere temiz, okunabilir ve test edilebilir kod yazma imkânı sunar.

MVC Mimarisi Nedir?

MVC, uygulama kodunu üç katmana ayıran bir mimari desendir:

KatmanSorumlulukLaravel Karşılığı
ModelVeri mantığı ve veritabanıapp/Models/
ViewKullanıcı arayüzüresources/views/
Controllerİş mantığı ve koordinasyonapp/Http/Controllers/

Route Tanımları

Tüm HTTP route'ları routes/web.php (web arayüzü) ve routes/api.php (API) dosyalarında tanımlanır.

// PHP //
// routes/web.php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
 
// Temel GET route
Route::get('/', function () {
    return view('welcome');
});
 
// Controller'a yönlendirme
Route::get('/posts', [PostController::class, 'index']);
Route::post('/posts', [PostController::class, 'store']);
Route::get('/posts/{id}', [PostController::class, 'show']);
 
// Resource route — tüm CRUD işlemlerini tek satırda tanımlar
Route::resource('products', ProductController::class);

Controller Oluşturma

// BASH //
php artisan make:controller PostController --resource

Bu komut app/Http/Controllers/PostController.php dosyasını oluşturur ve standart CRUD metodlarını iskelet olarak ekler:

// PHP //
<?php
 
namespace App\Http\Controllers;
 
use App\Models\Post;
use Illuminate\Http\Request;
 
class PostController extends Controller
{
    public function index()
    {
        $posts = Post::latest()->paginate(15);
        return view('posts.index', compact('posts'));
    }
 
    public function store(Request $request)
    {
        $validated = $request->validate([
            'title'   => 'required|string|max:255',
            'content' => 'required|string|min:10',
        ]);
 
        $post = Post::create($validated);
 
        return redirect()->route('posts.show', $post)
            ->with('success', 'Gönderi oluşturuldu.');
    }
 
    public function show(Post $post)
    {
        // Route Model Binding: Laravel $post'u otomatik yükler
        return view('posts.show', compact('post'));
    }
}

Route Model Binding

Laravel, route parametrelerini otomatik olarak Eloquent modeline dönüştürebilir:

// PHP //
// routes/web.php
Route::get('/posts/{post}', [PostController::class, 'show']);
 
// Controller'da
public function show(Post $post) // Laravel, {post} id'siyle Post'u otomatik bulur
{
    return view('posts.show', compact('post'));
}

Middleware ile Güvenlik

Middleware, HTTP isteği controller'a ulaşmadan önce araya giren katmanlardır:

// PHP //
// routes/web.php
Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::resource('posts', PostController::class)->except(['index', 'show']);
});
// PHP //
// Özel middleware oluşturma
php artisan make:middleware EnsureAdmin
 
// app/Http/Middleware/EnsureAdmin.php
public function handle(Request $request, Closure $next): Response
{
    if (!$request->user()?->isAdmin()) {
        abort(403, 'Yetkiniz yok.');
    }
    return $next($request);
}

Named Route ve URL Üretimi

// PHP //
// Route tanımında isim ver
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])
    ->name('posts.edit');
 
// Blade'de kullan
<a href="{{ route('posts.edit', $post) }}">Düzenle</a>
 
// Controller'da redirect
return redirect()->route('posts.index');

Request Validation

// PHP //
// Form Request oluştur
php artisan make:request StorePostRequest
 
// app/Http/Requests/StorePostRequest.php
class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return $this->user()->can('create', Post::class);
    }
 
    public function rules(): array
    {
        return [
            'title'    => 'required|string|max:255',
            'content'  => 'required|string|min:50',
            'category' => 'required|exists:categories,id',
            'tags'     => 'array|max:5',
            'tags.*'   => 'exists:tags,id',
        ];
    }
}
 
// Controller'da kullan
public function store(StorePostRequest $request): RedirectResponse
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

Sonuç

Laravel routing ve controller sistemi, büyük uygulamaları düzenli tutmanın temelini oluşturur. Route Model Binding, named routes ve Form Request validation ile hem hızlı hem de güvenli uygulamalar yazabilirsiniz. Bir sonraki derste Eloquent ORM ve migration sistemiyle devam edeceğiz.