Başlarken
Görünüm ve Arayüz
Veritabanı ve ORM
Ara Katmanlar (Middleware)
Özet: Laravel ara katman (middleware) mekanizması, istek filtreleme, küresel ve rota bazlı ara katman yapılandırması.
Ara Katmanlar (Middleware)
Ara katmanlar (Middleware), uygulamanıza gelen HTTP isteklerini incelemek ve filtrelemek için pratik bir mekanizma sağlar. Örneğin Laravel, uygulamanızın kullanıcısının kimliğinin doğrulanıp doğrulanmadığını kontrol eden bir kimlik doğrulama ara katmanı içerir. Kullanıcının kimliği doğrulanmamışsa, ara katman kullanıcıyı uygulamanızın giriş ekranına yönlendirir. Ancak kullanıcının kimliği doğrulanmışsa, ara katman isteğin uygulamanın daha derinlerine ilerlemesine izin verir.
Kimlik doğrulamanın yanı sıra CORS başlıklarını yönetmek, istekleri loglamak, oturumları başlatmak ve CSRF koruması sağlamak gibi birçok farklı görev için ara katmanlar yazılabilir.
Ara Katman Tanımlama
Yeni bir ara katman oluşturmak için make:middleware Artisan komutunu kullanabilirsiniz:
php artisan make:middleware EnsureTokenIsValid
Bu komut yeni ara katman sınıfınızı app/Http/Middleware dizininde oluşturur. Bu ara katmanda, gelen istekte belirli bir token girdisi olup olmadığını kontrol edelim:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class EnsureTokenIsValid
{
/**
* Gelen isteği işle.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if ($request->input('token') !== 'gizli-anahtar') {
return redirect('/home');
}
return $next($request);
}
}
Görüldüğü gibi, verilen token eşleşmezse ara katman istemciye bir HTTP yönlendirmesi döndürür; aksi takdirde istek $next callback'i çağrılarak uygulamanın sonraki aşamasına iletilir.
İstek Öncesi ve Sonrası Ara Katmanlar
Bir ara katmanın bir istek uygulamaya ulaşmadan önce mi yoksa yanıt üretildikten sonra mı çalışacağı, $next çağrısının konumuna bağlıdır:
İstek Öncesi (Before Middleware)
public function handle(Request $request, Closure $next): Response
{
// İstek uygulamaya gitmeden önce bu kısım çalışır:
// ...
return $next($request);
}
Yanıt Sonrası (After Middleware)
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
// Yanıt istemciye dönmeden hemen önce bu kısım çalışır:
$response->headers->set('X-Custom-Header', 'Deger');
return $response;
}
Ara Katmanları Kaydetme (Laravel 11)
Laravel 11 ile birlikte ara katman yapılandırmaları bootstrap/app.php dosyasında gerçekleştirilir.
Global Ara Katmanlar
Bir ara katmanın uygulamanıza gelen her HTTP isteğinde çalışmasını istiyorsanız, onu bootstrap/app.php dosyasındaki withMiddleware yapılandırmasına ekleyebilirsiniz:
->withMiddleware(function (Middleware $middleware) {
$middleware->append(EnsureTokenIsValid::class);
})
Ara katmanın listenin en başına eklenmesini isterseniz prepend yöntemini kullanabilirsiniz:
->withMiddleware(function (Middleware $middleware) {
$middleware->prepend(EnsureTokenIsValid::class);
})
Rotalara Ara Katman Atama ve Takma İsimler (Aliases)
Belirli rotalara özel ara katmanlar atamak için önce bir takma ad (alias) tanımlayabilirsiniz:
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'subscribed' => \App\Http\Middleware\EnsureUserIsSubscribed::class,
]);
})
Takma ad tanımlandıktan sonra rotalarda middleware yöntemiyle kullanılabilir:
// routes/web.php
Route::get('/abone-alani', function () {
// ...
})->middleware('subscribed');
Bir rotaya birden fazla ara katman atayabilirsiniz:
Route::get('/profil', function () {
// ...
})->middleware(['auth', 'subscribed']);
Ara Katman Grupları
Laravel varsayılan olarak web ve api ara katman gruplarını sunar. Bu gruplara yeni ara katmanlar eklemek veya mevcut olanları değiştirmek için:
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\App\Http\Middleware\LogHttpRequests::class,
]);
$middleware->api(prepend: [
\App\Http\Middleware\AlwaysAcceptJson::class,
]);
})
Ara Katman Parametreleri
Ara katmanlar ek bağımsız değişkenler (parametreler) kabul edebilir. Örneğin kullanıcının belirli bir "role" sahip olup olmadığını kontrol eden bir ara katman:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class EnsureUserHasRole
{
public function handle(Request $request, Closure $next, string $role): Response
{
if (! $request->user()->hasRole($role)) {
abort(403, 'Bu işlem için yetkiniz bulunmamaktadır.');
}
return $next($request);
}
}
Ara katman parametreleri rotalarda : karakterinden sonra virgülle ayrılarak iletilir:
Route::put('/post/{id}', function (string $id) {
// ...
})->middleware('role:editor');
Sonlandırılabilir Ara Katmanlar (Terminable Middleware)
Bazen bir ara katmanın, HTTP yanıtı tarayıcıya/istemciye tamamen gönderildikten sonra bazı temizlik veya loglama işlemleri yapması gerekebilir. Bunun için terminate yöntemini tanımlayabilirsiniz:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class TerminatingMiddleware
{
public function handle(Request $request, Closure $next): Response
{
return $next($request);
}
public function terminate(Request $request, Response $response): void
{
// Yanıt tarayıcıya gönderildikten sonra çalışır...
}
}