Laravel Blade Özel Direktif Oluşturma
Blade, bildiğiniz gibi Laravel'in template motoru. Ve kendine özel syntax'ı ile, view'larda doğrudan php yazmadan daha okunabilir kodlar yazmamızı sağlıyor. Ve view dosyalarımızda @
işareti ile başlayarak kullandığımız komutların adları direktif. Bazen özel olarak kendimize ait direktifler tanımlamak isteyebiliriz. Bu makalede size nasıl özel direktif tanımlayabileceğinizi göstereceğim.
En basit haliyle bir direktif şu şekilde tanımlanır;
Blade::directive('direktif_adi', function($expression){
return $expression;
});
Bu direktifi ister controller dosyanızda tanımlayıp sadece orada kullanın (ki bu mantıklı değil) ya da AppServiceProvider
dosyanızda boot()
metodu içinde tanımlayın ve her yerde kullanın.
Eğer controller dosyanızda kullanacaksanız önce dosyanızın başına şunu ekleyin;
use IlluminateSupportFacadesBlade;
Daha sonra metodun içinde şu şekilde tanımlayabilirsiniz;
..
public function index()
{
..
Blade::directive('text', function($express){
return $express;
});
..
}
..
Ve view'da @text(hello world)
şeklinde kullandığınızda ekrana yazıyı bastırır sadece. Evet bu direktif bir işe yaramıyor :D Çünkü daha anlamlı direktifler yazmanız gerekiyor.
Şimdi global olarak birkaç tane direktif tanımlayalım. Bunu app/Providers/AppServiceProvider.php
dosyasında boot()
metodunda tanımlıyoruz.
<?php
use IlluminateSupportFacadesBlade;
class AppServiceProvider extends ServiceProvider
{
..
public function boot()
{
Blade::directive('style', function($expression){
if (!empty($expression)) return '<link rel="stylesheet" type="text/css" href="' . mix('css/' . $expression) . '">';
return '<style>';
});
Blade::directive('endstyle', function(){
return '</style>';
});
Blade::directive('page', function($expression){
return "<?php if (request()->routeId('{$expression}')){ ?>";
});
Blade::directive('endpage', function(){
return "<?php } ?>";
});
}
..
Ve artık view sayfalarımızda şu şekilde kullanabiliriz;
@page(profile)
buraya profile özel içerik eklenecek
@endpage
@style
body {
background-color: red;
}
@endstyle
@style(users.css)
Son olarak isterseniz Blade::if()
ile şu şekilde bir kullanımda mevcut;
Blade::if('home', function(){
return request()->routeIs('index');
});
Bu şekilde tanımladığınızda @home
@else
ve @endhome
direktifleri otomatik olarak kullanılabiliyor. Yani;
@home
burası anasayfa
@else
burası anasayfa değil gibi :(
@endhome