Laravel 7 Middleware Yapısı ve Kullanımı
Middleware, bir web uygulamasında isteğin controllera gönderilmeden önce oturum kontrolü gibi bazı işlemleri yapan fonksiyonlara denir. Bu yüzden özellikle güvenlik önlemeleri almak yada oturumu kontrol etmek için sıklıkla kullanılır. Aynı zamanda bir middleware birden fazla route için kullanılabileceği gibi bir route için birden fazla middleware kullanılabilir.
Laravel 7 klasör yapısına göre, middleware dosyaları app/Http/middleware
yapısında bulunur. Laravel 7 kendi içinde oturum kontrolü ve CSRF koruması sağlayan bir middleware grubu bulundurur.
Bir Middleware Oluşturmak
Bir middleware oluşturmak için make:middleware
komutu kullanılır.
php artisan make:middleware CheckAge
Bu komut app/Http/middleware
klasörünün içinde bir CheckAge
sınıfı oluşturur. Oluşturduğumuz bu middleware ile sadece age parametresi 200’den büyük geçiş izni vereceğiz.
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->age <= 200) {
return redirect('home');
}
return $next($request);
}
}
Yukarıdaki örnekte gördüğünüz gibi eğer kullanıcının gönderdiği age parametresi 200’den fazla ise $next()
callback fonksiyonu ile kullanıcıya erişim izni veriyoruz. Eğer kullanıcının gönderdiği age
parametresi 200’den az ise redirect()
fonksiyonu ile 'home'
routeuna gönderiyoruz.
Before & After Middleware
Laravel 7 kullanarak bir middleware ile belirli işlemleri istek controllera gönderilmeden önce yapabildiğimiz gibi bunu sonrada yapabilmek mümkün. Örneğin, aşağıdaki middleware bazı işleri istek controllera gitmeden yapıyor.
<?php
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// Perform action
return $next($request);
}
}
Ancak diğer middleware görevlerini istek controllera iletildikten sonra yapıyor.
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
}
Middleware Kullanmak
Global Middleware
Eğer her http isteğinde çalışacak şekilde bir middleware yazmak isterseniz, onu app/Http/Kernel.php
sınıfındaki $middleware
parametresindeki middleware listesine eklemeniz gerekiyor.
Route Middleware
Eğer belirli routelarda çalışacak bir middleware yazmak isterseniz, onu app/Http/Kernel.php
sınıfındaki $routeMiddleware
parametresindeki middleware listesine bir anahtar ile eklemeniz gerekiyor.
protected $routeMiddleware = ['auth' => \App\Http\Middleware\Authenticate::class,'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,'can' => \Illuminate\Auth\Middleware\Authorize::class,'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,];
Belirli bir route için bir middleware kullanmak için onu Http Kernel dosyasında tanımladığınız anahtar kelime ile kullanabilirsiniz.
Route::get('admin/profile', function () {
//
})->middleware('auth');
Belirli bir route için aynı anda birden fazla middleware tanımlayabilirsiniz.
Route::get('/', function () {
//
})->middleware('first', 'second');
Belirli bir route için direk sınıf ismini kullanarak bir middleware kullanabilirsiniz.
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);
Aynı anda birden fazla route için bir veya birden fazla middleware kullanabilirsiniz. Aynı zamanda route grubundaki routelardan biri için withoutMiddleware()
fonksiyonu ile o route için geçersiz bir middleware oluşturabilirsiniz.
use App\Http\Middleware\CheckAge;
Route::middleware([CheckAge::class])->group(function () {
Route::get('/', function () {
//
});
Route::get('admin/profile', function () {
//
})->withoutMiddleware([CheckAge::class]);
});
Middleware Parametreleri
Bir middleware $request
ve Closure $next
dışında ek parametreler de alabilir. Örneğin, uygulamanızın bir kullanıcının isteğini gerçekleştirmeden önce kullanıcının rolünün kontrol etmesi gerekebilir. Bu kontrol işlemini CheckRole
adında $role
ek parametresi alan bir middleware oluşturarak yapabilirsiniz. Böylece farklı rollerdeki kişilerin farklı routelara erişimini tek bir middleware ile yönetebilirsiniz.
<?php
namespace App\Http\Middleware;
use Closure;
class CheckRole
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
}
Parametre almış bir middleware, bir route için ismi ve parametre değeri : ile ayrılarak kullanılır. Eğer bir den fazla parametre almış ise, parametreler , ile ayrılır.
Route::put('post/{id}', function ($id) {
//
})->middleware('CheckRole:editor');
Kısa Özet
- Laravel ile kendi özel middleware setinizi oluşturabilirsiniz.
- Url yapılarınızı middleware grupları içine alabilirsiniz.
- Middleware parametrelerini kullanarak onları özelleştirebilirsiniz.
“This article is published in https://www.code-forever.com/articles/laravel-7-middleware-yapisi-ve-kullanimi/ originally”