CodeWriteson Başkaları da girip konuyu okuyacağı için baştan sona yazıyorum, herkese faydası olsun:
Laravel'de Helper Kullanım Örneği
app/Support/Helper.php:
namespace App\Support;
class Helper
{
public function doSomething($param)
{
// ...
}
}
app/Providers/AppServiceProvider.php:
$this->app->bind('helper', function() {
return new \App\Support\Helper();
});
↑ Burada bind yönteminin ilk parametresi olan "helper", Helper sınıfımızın service container içinde takma ismi (alias). İstersek Helper sınıfına artık resolve('helper')
, app('helper')
, app()->make('helper')
, $this->app['helper']
... vs şeklinde, bulunulan yerde Container'a nasıl ulaşılabiliyorsa o şekilde takma isimle ulaşabiliriz. Şu konuda Request sınıfından örnek vermiştim: https://laravel.gen.tr/d/4030-url-e-gore-serviceprovider
app/Facades/Helper.php:
namespace App\Facades;
class Helper extends \Illuminate\Support\Facades\Facade
{
public static function getFacadeAccessor()
{
return 'helper';
}
}
↑ Tanımladığımız Helper isimli Facade ile artık asıl Helper sınıfı içindeki yöntemlere static olarak ulaşabiliriz. Helper::doSomething($param)
şeklinde... Burada önemli olan Helper::getFacadeAccessor() yönteminin döndüğü değer ile App::bind() içindeki kullandığımız takma ismin aynı olması gerekiyor.
Opsyionel olarak, bu Facade sınıfına da her yerden kolayca ulaşmak için takma isim verebiliriz. Bunu config/app.php içindeki aliases anahtarı içinde yapacağız.
config/app.php:
'aliases' => [
// ...
'Helper' => App\Facades\Helper::class,
]
Artık şu şekilde de uzun namespace olmadan kullanabiliriz:
use Helper;
Helper::doSomething($param);
Eğer bunu anonim fonksiyon şeklinde de kullanmak isterse app/Support/helpers.php dosyası oluşturalım. İçinde de örneğin şöyle bir yardımcı yöntem tanımlayalım:
if (! function_exists('doSomething')) {
function doSomething($param)
{
return Helper::doSomething($param);
}
}
Sonra bu helpers.php dosyasını Composer'a göstermemiz lazım ki bizim yerimize yüklesin. Bunun için kök dizindeki composer.json dosyasındaki autoload anahtarına files dizisi içinde ekliyoruz:
"autoload": {
"files": [
"app/Support/helpers.php"
],
//...
Artık doSomething($param) yardımcı fonksiyonunu istediğimiz yerde direkt kullanabiliriz.
Eğer bu yardımcı yöntemi Blade içinde kullanacaksak ve direktif olarak kullanmaya uygun ise bunu Blade direktifine çevirmek uygun olur. Blade direktifini yine AppServiceProvider::boot() içinde tanımlayabiliriz:
Blade::directive('doSomething', function ($param) {
return "<?php echo doSomething($param); ?>";
// ya da
// return "<?php echo Helper::doSomething($param); ?>";
});
Artık Blade içinde @doSomething($param)
şeklinde kullanabiliriz.
Siz yazmadan ben yazayım: "Hocam doSomething($param) mı Helper::doSomething($param) mı yoksa @doSomething($param) mu kullanmak mantıklı?"
Cevap:
doSomething($param), Helper::doSomething($param) 'dan ayrıca farklı bir iş yapıyorsa doğal olarak doSomething($param) kullanacaksınız. İkisi de aynı işi yapıyorsa farketmez. Aynı senaryo @doSomething($param) için de geçerli. Blade şablonunda öncelik direktif olanı kullanmak çünkü direktif Helper::doSomething($param) ya da doSomething($param) olandan ek bir şeyler de yapıyor olabilir.