Laravel 7 Middleware Yapısı ve Kullanımı

Furkan Zerman
Stingy Developer
Published in
3 min readNov 19, 2020
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”

--

--