Laravel/Lümen Middleware

Merhaba,

Bu yazıda middleware konusundan bahsedeceğim. Middleware adından da anlaşılacağı üzere ara katman olarak kullanılan kod parçasıdır. Action çalışmadan önce yada sonra devreye girer. Diğer bir değişle, HTTP isteklerinin filtrelenmesi için kullanılır. Sayfayı görüntülemek isteyen kullanıcının login olup olmadığını bir middleware kontrol edip login işlemi gerçekleşmişse istek attığı sayfaya, login olmamışsa login sayfasına yönlendirebilirsiniz.

Laravel ve Lümen’de middleware Kullanımı

php artisan make:middleware Test

Komutu ile app/Http/Middleware/Test.php dosyasını oluşturun.

Dosya içeriği aşağıdaki gibi olacaktır.

namespace App\Http\Middleware;

use Closure;

class Test
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Http isteklerinde yapmak isteğiniz işlemler handle fonksiyonu içerisine yazılacaktır. return $next($request); satırı isteğin action’a gönderilmesi sağlaya kısımdır. Dolayısı ile sayfa çalışmadan önce işlem yapmak için, yapacağınız işlemleri bu satırdan önce çalıştırmanız gerekirken, sayfa çalıştıktan sonra yapacağınız işlemleri bu satırdan sonra eklemeniz gerekecektir. Bu konuyu yazının ilerleyen kısmında daha net açıklayacağım. Şimdilik ufak bir örnekle ilerleyelim. HomeController@test action’ına yapılan her istekte sayfayı göstermeden önce storage/app/test.txt dosyasına istek yapan kullanıcın ip adresini yazalım.

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Storage;

class Test
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        Storage::append('test.txt', $_SERVER['REMOTE_ADDR']);
        return $next($request);
    }
}

Middleware‘i hazırladık. Şimdi sıra geldi hazırladığımız middleware‘i Laravel’in http kernel’ına ekleme işlemine. Bu işlem için app/Http/Kernel.php dosyasında $routeMiddleware dizisine, oluşturduğumuz middleware‘i ekliyoruz.

    protected $routeMiddleware = [
        ...,
        ...,
        ...,
        'test' => \App\Http\Middleware\Test::class,
    ];

Artık oluşturduğumuz Test middleware‘ini routes/web.php içinde kullanabiliriz.

Route::get('/test', 'HomeController@test')
    ->middleware('test');

Yazarak işlemi tamamlamış oluyoruz. domain.com/test adresine yapılan her istekte, kullanıcının ip adresi storage/app/test.txt dosyasına kaydediliyor.

127.0.0.1
172.28.0.1

Middleware After / Before

Yazdığımız middleware, action çalışmadan önce mi yoksa sonra mı çalışacak ? Yukarıda da bahsettiğim gibi bunu belirlemek bizim elimizde. Bunun için iki farklı yöntem kullanabiliriz. Birincisi kendi komuzu handle fonksiyonu içinde return kodunun üzerine veya altına yazmak. Diğer yöntem ise terminate fonksiyonunu kullanmak.

Önce ilk yolu ele alalım. Action açılmadan kodumuzun çalışması için aşağıdaki kullanıma başvururuz.

public function handle($request, Closure $next)
{
    // Eylem
    return $next($request);
}

Action çalıştıktan sonra işlem yapmak için ise

public function handle($request, Closure $next)
{
    $response = $next($request);
    // Eylem
    return $response;
}

Şeklinde kullanabilirsiniz, ama bu yolu önermiyorum. Action’dan sonra çalıştırmak için, ikinci yol olan terminate fonsiyonu’nu kullanmak daha mantıklı olacaktır.

Laravel middleware terminate

Middleware dosyası içinde terminate isminde fonksiyon oluşturun. işlemlerini bu fonksiyonda gerçekleştirin. handle fonksiyonu action’dan önce devreye girerken, terminate fonsiyonu action’dan sonra devreye girer.

class Test
{

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Oturum verileri ile işlem yap...
    }
}

Middleware’in Route’de tanımlanma şekilleri

Bir middleware‘i tek route‘ye veya bir guruba tanımlama ihtiyaca doğabilir. Böyle durumlar için aşağıdaki örnekleri kullanabilirsiniz.

Route ya Middleware atamak için
Route::get('/test', 'HomeController@test')
    ->middleware('test');
Route ye birden fazla Middleware atamak için
Route::get('/test', 'HomeController@test')
    ->middleware('test', 'test2);
Guruba Middleware atamak için
Route::group(['prefix' => '/', 'middleware' => ['test']], function () {
    Route::get('/', 'HomeController@home');
    Route::get('/test', 'HomeController@test');
});

Umarım işinize yaramıştır.

Yorum Ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir