Laravel Blade yapısını kullanarak view dosyalarını daha okunaklı hale getirebilirsiniz. Blade Directive ise PHP kodlarını HTML kodları içerisine okunaklı şekilde gömmenizi sağlar. Örnek olarak genel olarak kullandığımız @if, @foreach, @isset fonksiyonları verilebilir.
Bu içerikte kendi özel Blade Directive’inizi oluşturup kullanalım. Blade Directive örnek yapısı şu şekildedir;
Blade::directive('directive_name', function () { return 'My First Blade Directive'; });
Bu kodu app/Providers/AppServiceProvider.php sayfası boot() metoduna eklemeniz gerekiyor.
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade; // import işlemini unutmayın. use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function register() { // } public function boot() { Blade::directive('directive_name', function () { return 'My First Blade Directive'; }); } }
View klasöründeki blade dosyasında kullanımı;
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Custom Blade Directives</title> </head> <body> @directive_name() </body> </html>
Örneğimizde; “My First Blade Directive” çıktınızı almış olacaksınız.
Şimdi de örneğimize ek özellikler ekleyelim;
Anasayfa’da olup olmadığımızı kontrol eden bir yapı kuralım;
public function boot() { Blade::directive('isHome', function () { $isHomePage = false; // check if we are on the homepage if ( request()->is('/') ) { $isHomePage = true; } return "<?php if ($isHomePage) { ?>"; }); Blade::directive('notHome', function () { return "<?php } else { ?>"; }); Blade::directive('endHome', function () { return "<?php } ?>"; }); }
app/Providers/AppServiceProvider.php dosyasındaki boot() metoduna directive oluşturmuş olduk. Daha sonra kontrol için kullanacağımız iki route oluşturalım.
Route::get('/', function () { return view('welcome'); }); Route::get('/posts', function(){ return view('welcome'); });
Ansayfa konrtolu yapacağımız sayfalara oluşturduğumuz directive komutunu çalıştıralım;
//dans.blade.php <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Adding Functionality to Custom Blade Directives</title> </head> <body> @isHome <p>We are on the homepage</p> @notHome <p>We are on a different page than the homepage</p> @endHome </body> </html>
Anasayfa ve /posts url’leri aynı view dosyasını çalıştıracaktır. Ancak; anasayfadayken “We are on the homepage” uyarısını alırken, /posts sayfasında “We are on a different page than the homepage” uyarısı görünecektir.
Özel Blade “If” Directive’leri
Laravel Blade If Directive’i kullanarak daha etkili yapılar oluşturulabilir. Önceki örnek üzerinden kullanımı şöyledir;
// app/Providers/AppServiceProvider.php dosyası, boot() metoduna eklenecek yapı. Blade::if('isHome', function () { return request()->is('/'); });
View dosyanızdaki blade kodlarını şu şekilde değiştirmelisiniz;
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Custom Blade Directives</title> </head> <body> @isHome we are on home @else not home @endisHome </body> </html>
Blade Directive’lere Parametre Atama
Blade Directive’lerine parametre göndererek yapılarınızda kullanabilirsiniz. Basit bir örnekte bu durumu anlatacak olursak; örneğimizde @greet directive’i ile verilen ismi ekrana yazdıracağız.
// app/Providers/AppServiceProvider.php dosyası, boot() metoduna eklenecek yapı. public function boot() { Blade::directive('greet', function ($name) { return "<?php echo 'Hello ' . $name ?>"; }); }
View dosyasında kullanımı;
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Custom Blade Directives</title> </head> <body> @greet('Dans') </body> </html>
Sayfayı kontrol ettiğinizde ekrana “Hello Dans” basacaktır.
Blade “If” Directive’lerine Parametre Göndermek
Bu örnekte if/elseif yapısını kullanarak farklı değerlere göre kontrol işlemini yapalım. AppServiceProvider dosyası aşağıdaki gibi olacaktır.
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function register() { // } public function boot() { Blade::if('env', function ($environment) { return app()->environment($environment); }); } }
View dosyasına @env directive’i ekleyerek uygulamanızın durumunu(local, production vb.) kontrol ettirebilirsiniz.
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Custom Blade Directives</title> </head> <body> @env('local') <p>The application is in the local environment</p> @elseenv('testing') <p>The application is in the testing environment</p> @else <p>The application is not in the local or testing environment</p> @endenv </body> </html>
@elseenv ile farklı durumları kontrol etmiş olduk. Ayrıca AppServiceProvider dışında bir Service Provider dosyası oluşturup directivlerinizi yeni dosyaya eklerseniz daha kolay ve kullanışlı işlemler yapmış olursunuz. Bunun için;
php artisan make:provider BladeServiceProvider app/Providers/<strong>BladeServiceProvider.php</strong> dosyası oluşmuş olacaktır. Bu dosyadaki boot() metodu içine directive oluşturun. Son olarak bu dosyayı <strong>provider</strong> olarak tanıtmanız gerekiyor. Bunun için <strong>app/config.php</strong> dosyasını açın ve providers dizisini aşağıdaki gibi düzenleyin. 'providers' => [ // Diğer Service Provider Sınıfları App\Providers\BladeServiceProvider::class, ],
*Not: Her directive oluşturduktan sonra php artisan view:clear komutu ile view dosyalarını temizlemeyi unutmayın.
İlk Yorumu Siz Yapın