Laravel middleware ara yazılım olarak geçer. Öreneğin bir post veya sayfa yönlendirmelerinde controller klasını ulaşmadan yapmanız gerenkenleri bu ara yazılımda yapabilirsiniz. Bu bize controller da yapacağınız işlemleri ön filitrelemeden de geçirmek diyebiliriz. Bir diğer örnek verecek olursak, her sistemde mecut olan oturum kontrol sistemlerini middleware ile daha kolay yapabiliriz. Oturum açmamış bir kullanıcıyı laravel middleware ile kontrol ettikten sonra ilgili sayfaya yönlendirmesini sağlayabiliriz. Larevelde tanımlamış olduğunuz middleware ara yazılımlar projenizin app/Http/Middleware
klasörü altında oluşturlur. Şimdi uygulamalar üzerinden anlatalım.
İlk olarak middleware oluşturalım. Laravel middliware oluşturmak için consola aşağıdaki komudu girelim.
php artisan make:middleware MyMiddleware
Bu komuttan sonra App/Http/Middleware
dizini altında MyMiddleware.php oluşmaktadır.Klass içerisindeki public function handle(Request $request, Closure $next){}
fonksiyonunu aşağıdaki gibi düzenleyelim.
//App/Http/Middleware/MyMiddleware public function handle(Request $request, Closure $next) { if(true){ echo "MyMiddleware Çalıştı"; } return $next($request); }
Sonra bu
routes/web.php
dosyasını açlım ana dizin yönlendirmesin de kullanılacak Rotue::get()
fonksiyonumuzu yazalım ve oluşturduğumuz MyMiddleware bağlayalım. Tabi bunları yapmadan önce
routes/web.php
sayfamıza oluşturduğumuz MyMiddleware klasımızı burdaki gibi use App\Http\Middleware\MyMiddleware;
çağıralım.
use App\Http\Middleware\MyMiddleware; Route::get('/',function(){ echo "<br>Burda bir controller fonsiyon çalışacak"; })->middleware(MyMiddleware::class); /* Ekran Çıktısı: MyMiddleware Çalıştı Burda bir controller fonsiyon çalışacak */
Sistem ilk etapta http://localhost:8000/
url istekte bulunduğunda routes/web.php
çalıştı. Bu url için belirtmiş olduğumuz route tetikledi. İlgli route’nin sonuna eklemiş olduğumuz ->middleware(MyMiddleware::class)
çalıştırdı. Klass içerisindeki handle fonksiyonu içerinsindeki kod bloğu çalıştı. Fonksiyon içerisndeki karar yapısına true
dediğimiz için ekranan “MyMiddleware Çalıştı” yazdı ve daha sonra route içersinde controlleren geleceği yerdeki fonksiyonu çalıştırdı. Bu fonksiyonda ekrana “Burda bir controller fonsiyon çalışacak” yazdıktan sonra sistem sonlandı.
Middleware için web.php’de çağırmış olduğumuz dosyayı isterseni sayfa yüklenirken oto yüklenmesini sağlayabiliriz. App\Http\Kernel.php
dosyasını açalım ve içersinde protected $routeMiddleware
yazılı olan dizinin sonuna 'MyMiddleware'=>\App\Http\Middleware\MyMiddleware::class
sınfını ekleyelim. Artık web.php phpde çağırmanıza gerek kalmadı. Her seferinde ana sistem kendisi yükleycek.
Laravel Birden Fazla Middleware Kullanımı
Birden fazla middleware kullanmak istiyorsak öncelikle bir tanedaha middleware oluşturalım.
php artisan make:middleware MyMiddleware_2
App/Http/Middliware/MyMiddleware_2
dizininde bir middleware daha oluşturduk. İçersindeki public function handle(Request $request, Closure $next)
aşağıdaki gibi düzenleyelim.
public function handle(Request $request, Closure $next) { if(true){ echo "<br />MyMiddleware_2 çalıştı."; } return $next($request); }
Daha sonra web.php dosyamıza use App\Http\Middleware\MyMiddleware; use App\Http\Middleware\MyMiddleware_2;
sınfılarımızı çağıralım ve aşağıdaki rotue ekleyelim.
use App\Http\Middleware\MyMiddleware; use App\Http\Middleware\MyMiddleware_2; Route::get('/',function(){ echo "<br>Burda bir controller fonsiyon çalışacak"; })->middleware([MyMiddleware::class,MyMiddleware_2::class]); /* Ekran Çıktısı : MyMiddleware Çalıştı MyMiddleware_2 çalıştı. Burda bir controller fonsiyon çalışacak */
Bu sayede iki adet middleware çaştırmış olduk. Tabi handle fonksiyonunda yapmış if karar yapısında redirect ile sayfa yönlendirmleri veya gelen sayfaya hata gönderimi yapabilirsiniz.
Laravel Middleware Group Kullanımı
Oluşturmuş olduğumuz middleware sınıfını birden çok sayfada kullanamamız gerekiyorsa aşağıdaki gibi gruplama yapabiliriz.
use App\Http\Middleware\MyMiddleware; Route::middleware(MyMiddleware::class)->group(function(){ Route::get('/',function(){ echo "<br />Anasayfa Çalıştır"; }); Route::get('/login',function(){ echo "<br />Login Sayfası Çalıştı."; }); });
Laravel Middleware Parametre Gönderme
İsterseni middleware ara yazılımınıza var olan parametrelerin haricinde daha fazla parametere gönderebilirsiniz. Önce karnel.php’de sınıfımızın kendi kendine yüklenmesini sağlamak için 'MyMiddleware'=>\App\Http\Middleware\MyMiddleware::class,
tanımlamamızı yapıyoruz. Daha sonra web.php’de rotamızı belirliyoruz.
//rotes/web.php Route::get('/test',function(){ echo "<br />Controller çalıştı."; })->middleware('MyMiddleware:40'); /* Ekan çıktısı: Gelen parametre numeric id : 40 Controller çalıştı. */
En önemli kısmı ise MyMiddleware sınıfımızda aşağıdaki gibi düzenliyoruz.
public function handle(Request $request, Closure $next,$id) { if(is_numeric($id)){ echo "Gelen parametre numeric id : ".$id; }else{ echo "Gelen id numeric değil!".$id; } return $next($request); }
Laravel Middleware Terminate Kullanımı
Middleware çalışıp tarayıcıya yanıt verildikten sonra çalışmasını istediğiniz işlemler olabilir bunu aşağıdaki gibi yapabiriz. Middleware düzenleyelim önce.
public function handle(Request $request, Closure $next) { if(true){ echo "Middleware Çalıştı.<br />"; } return $next($request); } public function terminate($request, $response) { echo "<br > En son çalışır."; }
Daha sonra route düzenleyelim.
use App\Http\Middleware\MyMiddleware; Route::get('/',function(){ echo "<br />Controller çalıştı."; })->middleware(MyMiddleware::class); /* Ekran Çıktısı: Middleware Çalıştı. Controller çalıştı. En son çalışır. */