Symfony : Bir bundle icinde Service olusturmak

mehmet soylu
2 min readFeb 6, 2021

--

Bundle icinde varolan servisler uygulamanin configleri icindeki service.yaml icinde tanimlanmazlar. Bu yazi bundle icinde bir servisi nasil olusturup kullanabileceginizi ve dizin yapisini aciklayacak.

Extension Class olusturmak

Bunun icin dependency injectin ( DI ) uzerinde bir bagimlilik tanimlamaniz gerekiyor. Normal sartlarda kurallara uymaniz onemli;

  • Extension `DependencyInjection`ile biten bir namespace icinde yer almali
  • Symfony\Component\DependencyInjection\Extension\ExtensionInterface ile yazilmis Symfony\Component\DependencyInjection\Extension\Extension sinifini extend ederek olusturulmali.
  • AcmeHelloBundle için olanı AcmeHelloExtension gibi adlandırılmali

Ornek;

Extension Class icin Manuel Kayit

Yukaridaki kurallara uymadiginizda extension kaydini siz yapmalisiniz. Bunu icin Bundle::getContainerExtension() methodu su sekilde gecersiz kilinmalidir;

Ayrica extension class bu kurallara uyumadigi zaman getAlias methodunu da override etmelisiniz. Bu sekilde DI dogru methodu donderebilir. DI alias, container icindeki ismi belirtmek icin kullanilan addir. Varsayılan olarak, bu, Uzantı sonekini kaldırarak ve sınıf adını alt çizgilere dönüştürerek yapılır.

AcmeHelloExtensionicin acme_hello gibi.

load() Methodunun kullanimi

Load () yönteminde, bu extension ilgili tüm servisler ve parametreler yüklenecektir. Bu method kapsayici orneginin gercegini degil instance halini alir. Bu container sadece gercek containera ait parametrelere sahiptir. Yukleme gerceklesince servis ve parametreler ile gercek container ve instance service parametreleri birlestirilir.

Load methodunda php ile servis tanimlari kaydedilebilir ama bunlari yaml benzeri bir config dosyasina koymak daha iyi fikirdir.

Resources/config icindeki services.xml icin ornek;

XMLFileLoader disinda YamlFileLoader ve PhpFileLoader vardir.

Servis ayarlarini degistirmek icin yapilandirma

Extension ayrica bundle icin yapilandirmayi belirler. Detaylar icin https://symfony.com/doc/current/bundles/configuration.html

Classlari derlemeye eklemek

Bundlelar, genel performansı iyileştirmek için uygulama önbelleğini oluştururken derlenmeleri için Symfony’ye hangi sınıflarının ek açıklamalar içerdiği konusunda ipucu verebilir. Define the list of annotated classes to compile in the addAnnotatedClassesToCompile() method:

Not : Bazı classlar diğer classlardan extend edilirse, tüm parent ogeler otomatik olarak derlenecek classlar listesine dahil edilir.

Patternler, Composer tarafından oluşturulan class haritasi kullanılarak gerçek class namespace adreslerine dönüştürülür. Bu yuzden composer dumpautoload calistirarak class haritasina bunlari dahil etmelisiniz.

Dikkat : Bu teknik siniflarda __DIR__ ve __FILE__ sabitleri ile kullanilamaz. Cunku bu degerler classes.php dosyasi yuklenirken degisecektir.

--

--