Hizmet Tanımları
Yapılandırma, DI konteynerine tek tek hizmetlerin nasıl bir araya getirileceği ve diğer bağımlılıklarla nasıl bağlanacağı konusunda talimat verdiğimiz yerdir. Nette bunu başarmak için çok açık ve zarif bir yol sunar.
NEON yapılandırma dosyasındaki services
bölümü, özel hizmetlerimizi ve yapılandırmalarını
tanımladığımız yerdir. PDO
sınıfının bir örneğini temsil eden database
adlı bir hizmetin
tanımlanmasına ilişkin basit bir örneğe bakalım:
Bu yapılandırma DI konteynerinde aşağıdaki fabrika yöntemiyle sonuçlanır:
Hizmet adları, @serviceName
biçimini kullanarak yapılandırma dosyasının diğer bölümlerinde bunlara
başvurmamızı sağlar. Hizmeti adlandırmaya gerek yoksa, sadece bir madde işareti kullanabiliriz:
DI konteynerinden bir hizmeti almak için, parametre olarak hizmet adıyla birlikte getService()
yöntemini veya
hizmet türüyle birlikte getByType()
yöntemini kullanabiliriz:
Hizmet Oluşturma
En yaygın olarak, sadece belirli bir sınıfı örnekleyerek bir hizmet oluştururuz. Örneğin:
Yapılandırmayı ek anahtarlarla genişletmemiz gerekirse, tanım birden fazla satıra genişletilebilir:
create
anahtarının bir takma adı vardır factory
, her iki sürüm de pratikte yaygındır. Ancak
biz create
adresini kullanmanızı öneririz.
Kurucu argümanları veya oluşturma yöntemi alternatif olarak arguments
anahtarına yazılabilir:
Hizmetler sadece bir sınıfın basit bir şekilde örneklenmesiyle oluşturulmak zorunda değildir; statik yöntemlerin veya diğer hizmetlerin yöntemlerinin çağrılmasıyla da ortaya çıkabilirler:
Basitlik için ->
yerine ::
kullandığımızı unutmayın, ifade
araçlarına bakın. Bu fabrika yöntemleri oluşturulur:
DI konteynerinin oluşturulan hizmetin türünü bilmesi gerekir. Belirtilen bir dönüş türüne sahip olmayan bir yöntem kullanarak bir hizmet oluşturursak, yapılandırmada bu türden açıkça bahsetmeliyiz:
Argümanlar
Normal PHP'ye çok benzer bir şekilde kuruculara ve yöntemlere argümanlar aktarırız:
Daha iyi okunabilirlik için, argümanları ayrı satırlarda listeleyebiliriz. Bu formatta virgül kullanımı isteğe bağlıdır:
Argümanlara isim de verebilirsiniz, böylece sıraları konusunda endişelenmenize gerek kalmaz:
Belirli bağımsız değişkenleri atlamak ve varsayılan değerlerini kullanmak veya otomatik bağlantı yoluyla bir hizmet eklemek istiyorsanız, bir alt çizgi kullanın:
Bağımsız değişkenler hizmetler, parametreler ve çok daha fazlası olabilir, ifade araçlarına bakın.
Kurulum
setup
bölümünde, hizmet oluşturulurken çağrılması gereken yöntemleri tanımlıyoruz.
PHP'de bu şöyle görünecektir:
Yöntem çağrılarına ek olarak, özelliklere değer de aktarabilirsiniz. Bir diziye eleman eklemek de desteklenir, ancak NEON sözdizimiyle çakışmasını önlemek için bunu tırnak içine almanız gerekir:
PHP'de bu şu anlama gelir:
Kurulumda, statik yöntemleri veya diğer hizmetlerin yöntemlerini de çağırabilirsiniz. Geçerli hizmeti argüman olarak
geçirmeniz gerekiyorsa, @self
adresini kullanın:
Basitlik için ->
yerine ::
kullandığımızı unutmayın, ifade
araçlarına bakın. Bu, aşağıdaki fabrika yöntemini oluşturur:
İfade Araçları
Nette DI bize son derece zengin ifade yetenekleri sunarak neredeyse her şeyi ifade etmemize olanak tanır. Yapılandırma dosyalarında parametreler kullanabiliriz:
Ayrıca nesneler oluşturabilir, yöntemler ve fonksiyonlar çağırabiliriz:
Hizmetlere ya adlarıyla ya da türlerine göre atıfta bulunun:
Birinci sınıf çağrılabilir sözdizimi kullanın:
Sabitleri kullanın:
Metot çağrıları PHP'de olduğu gibi zincirleme yapılabilir. Basitlik için ->
yerine ::
kullanacağız:
Bu ifadeler hizmetler oluşturulurken herhangi bir yerde, argümanlarda, kurulum bölümünde veya parametrelerde kullanılabilir:
Özel Fonksiyonlar
Yapılandırma dosyaları içinde bu özel işlevleri kullanabilirsiniz:
- Değer olumsuzlama için
not()
- Kayıpsız tip dökümü için
bool()
,int()
,float()
,string()
typed()
belirtilen türdeki tüm hizmetlerin bir dizisini oluşturmak içintagged()
belirli bir etikete sahip tüm hizmetlerin bir dizisini oluşturmak için
PHP'deki (int)
gibi geleneksel tip atamayla karşılaştırıldığında, kayıpsız tip atama sayısal olmayan
değerler için bir istisna oluşturur.
typed()
işlevi, belirli bir türdeki (sınıf veya arayüz) tüm hizmetlerin bir dizisini oluşturur. Otomatik
kablolaması kapalı olan hizmetleri hariç tutar. Virgülle ayrılarak birden fazla tür belirtilebilir.
Otomatik kablolamayı kullanarak belirli bir türdeki bir dizi hizmeti otomatik olarak argüman olarak da iletebilirsiniz.
tagged()
işlevi, belirtilen etikete sahip tüm hizmetlerin bir dizisini oluşturur. Birden fazla etiket virgülle
ayrılarak listelenebilir.
Otomatik Kablolama
autowired
tuşu, belirli bir hizmet için otomatik kablolama davranışını değiştirmenize olanak tanır. Daha
fazla ayrıntı için otomatik kablolama bölümüne bakın.
Tembel Hizmetler
Tembel yükleme, bir hizmetin oluşturulmasını gerçekten ihtiyaç duyulana kadar geciktiren bir tekniktir. Tembel hizmet oluşturmayı yapılandırmada tüm hizmetler için aynı anda global olarak etkinleştirebilirsiniz. Bireysel hizmetler için bu davranış geçersiz kılınabilir:
Bir hizmet tembel olarak tanımlandığında, DI konteynerinden talep edildiğinde özel bir proxy nesnesi döndürülür. Bu proxy gerçek hizmet gibi görünür ve davranır, ancak gerçek başlatma (kurucu çağrısı ve kurulum) yalnızca yöntemlerinden veya özelliklerinden herhangi biri ilk kez çağrıldığında gerçekleşir.
Tembel yükleme sadece kullanıcı tanımlı sınıflar için kullanılabilir, dahili PHP sınıfları için kullanılamaz. PHP 8.4 veya daha yenisini gerektirir.
Etiketler
Etiketler hizmetlere ek bilgi eklemek için kullanılır. Bir hizmete bir veya daha fazla etiket atayabilirsiniz:
Etiketler değer de taşıyabilir:
Belirli etiketlere sahip tüm hizmetleri almak için tagged()
işlevini kullanabilirsiniz:
DI konteynerinde, findByTag()
yöntemini kullanarak belirli bir etikete sahip tüm hizmetlerin adlarını elde
edebilirsiniz:
Enjeksiyon Modu
inject: true
bayrağının kullanılması, bağımlılıkların inject ek açıklaması ve inject*() yöntemleri ile genel değişkenler
aracılığıyla aktarılmasını etkinleştirir.
Varsayılan olarak, inject
yalnızca sunum yapanlar için etkinleştirilir.
Hizmet Değişiklikleri
DI konteyneri, yerleşik veya kullanıcı uzantıları tarafından eklenen birçok hizmet
içerir. Bu hizmetlerin tanımlarını doğrudan yapılandırma içinde değiştirebilirsiniz. Örneğin, geleneksel olarak
Nette\Application\Application
olan application.application
hizmetinin sınıfını başka bir şeyle
değiştirebilirsiniz:
alteration
bayrağı bilgilendiricidir ve yalnızca mevcut bir hizmeti değiştirdiğimizi gösterir.
Kurulumu da tamamlayabiliriz:
Bir hizmetin üzerine yazarken, orijinal argümanları, kurulum öğelerini veya etiketleri kaldırmak isteyebilirsiniz, işte
bu noktada reset
kullanışlı hale gelir:
Bir uzantı tarafından eklenen bir hizmeti kaldırmak isterseniz, bunu şu şekilde yapabilirsiniz: