Laravel: Sıfırdan İleri Seviye

Ders 12/17 45 dakika

Middleware

Middleware kavramı, custom middleware oluşturma ve kullanım senaryoları.

Middleware

Middleware, HTTP isteklerini filtrelemek için kullanılır. İstek controller'a ulaşmadan önce veya response gönderilmeden önce işlem yapabilir.

Middleware Oluşturma

php artisan make:middleware CheckAge
age < $minAge) {
            return redirect('home')->with('error', 'Yaş yeterli değil!');
        }

        return $next($request);  // Sonraki middleware'e/controller'a geç
    }
}

// After Middleware
class LogResponse
{
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        
        // Response oluştuktan sonra
        Log::info('Response status: ' . $response->status());
        
        return $response;
    }
}

Middleware Kaydetme (Laravel 11+)

// bootstrap/app.php
use App\Http\Middleware\CheckAge;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
    )
    ->withMiddleware(function (Middleware $middleware) {
        // Global middleware
        $middleware->append(LogRequests::class);
        
        // Alias (route'larda kullanmak için)
        $middleware->alias([
            'age' => CheckAge::class,
            'admin' => EnsureUserIsAdmin::class,
        ]);
        
        // Grup middleware
        $middleware->group('admin', [
            'auth',
            'admin',
        ]);
    })
    ->create();

Middleware Kullanımı

// Tek route
Route::get('/adult-content', function () {
    // ...
})->middleware('age:21');

// Birden fazla
Route::get('/profile', function () {
    // ...
})->middleware(['auth', 'verified']);

// Grup
Route::middleware(['auth', 'admin'])->group(function () {
    Route::get('/admin/dashboard', [AdminController::class, 'dashboard']);
    Route::get('/admin/users', [AdminController::class, 'users']);
});

// Controller'da
class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('admin')->except('index');
        $this->middleware('log')->only('store');
    }
}

Yaygın Middleware Örnekleri

// Admin kontrolü
class EnsureUserIsAdmin
{
    public function handle(Request $request, Closure $next)
    {
        if (!$request->user()?->isAdmin()) {
            abort(403, 'Yetkisiz erişim');
        }

        return $next($request);
    }
}

// Locale ayarlama
class SetLocale
{
    public function handle(Request $request, Closure $next)
    {
        $locale = $request->header('Accept-Language', 'tr');
        app()->setLocale($locale);

        return $next($request);
    }
}

// Maintenance mode bypass
class CheckForMaintenanceMode
{
    public function handle(Request $request, Closure $next)
    {
        if (app()->isDownForMaintenance()) {
            if (!in_array($request->ip(), config('maintenance.allowed_ips'))) {
                abort(503);
            }
        }

        return $next($request);
    }
}

Önemli Noktalar

  • Middleware HTTP request/response filtresidir
  • Global, route ve group middleware türleri var
  • php artisan make:middleware ile oluşturulur
  • bootstrap/app.php'de kaydedilir
  • Before ve after middleware pattern'leri