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.