Inject Metotları ve Nitelikleri
Bu makalede, Nette framework'ünde presenter'lara bağımlılıkları iletmenin farklı yollarına odaklanacağız. Tercih edilen yöntem olan yapıcıyı, inject metotları ve nitelikleri gibi diğer seçeneklerle karşılaştıracağız.
Presenter'lar için de bağımlılıkların yapıcı
aracılığıyla iletilmesinin tercih edilen yol olduğu geçerlidir. Ancak, diğer presenter'ların miras aldığı ortak bir ata
sınıf (örneğin BasePresenter
) oluşturuyorsanız ve bu ata sınıfın da bağımlılıkları varsa, yapıcı cehennemi dediğimiz
bir sorun ortaya çıkar. Bu, inject metotları ve nitelikleri (eski adıyla anotasyonlar) olan alternatif yollarla
aşılabilir.
inject*()
Metotları
Bu, bağımlılığın ayarlayıcı ile
iletilmesinin bir şeklidir. Bu ayarlayıcıların adı inject
önekiyle başlar. Nette DI, bu şekilde
adlandırılan metotları presenter örneği oluşturulduktan hemen sonra otomatik olarak çağırır ve onlara tüm gerekli
bağımlılıkları iletir. Bu nedenle public
olarak bildirilmelidirler.
inject*()
metotları, yapıcının birden fazla metoda genişletilmiş bir türü olarak kabul edilebilir. Bu
sayede BasePresenter
, bağımlılıkları başka bir metot aracılığıyla alabilir ve yapıcıyı alt sınıfları
için serbest bırakabilir:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
private Foo $foo;
public function injectBase(Foo $foo): void
{
$this->foo = $foo;
}
}
class MyPresenter extends BasePresenter
{
private Bar $bar;
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
}
Bir presenter, keyfi sayıda inject*()
metodu içerebilir ve her biri keyfi sayıda parametreye sahip olabilir.
Bu, presenter'ın trait'lerden oluştuğunda ve her birinin
kendi bağımlılığını gerektirdiği durumlarda da harika çalışır.
Inject
Nitelikleri
Bu, özelliğe enjekte
etme şeklidir. Hangi değişkenlere enjekte edileceğini belirtmek yeterlidir ve Nette DI, presenter örneği
oluşturulduktan hemen sonra bağımlılıkları otomatik olarak iletir. Bunları ekleyebilmesi için public
olarak
bildirilmelidirler.
Özellikleri nitelikle işaretleriz: (daha önce /** @inject */
anotasyonu kullanılıyordu)
use Nette\DI\Attributes\Inject; // bu satır önemlidir
class MyPresenter extends Nette\Application\UI\Presenter
{
#[Inject]
public Cache $cache;
}
Bu bağımlılık iletme yönteminin avantajı, çok kısa bir yazım şekli olmasıydı. Ancak, constructor property promotion 'ın gelişiyle, yapıcıyı kullanmak daha kolay görünüyor.
Tersine, bu yöntem, genel olarak özelliklere bağımlılık iletmeyle aynı dezavantajlara sahiptir: değişken üzerindeki değişiklikler üzerinde kontrolümüz yoktur ve aynı zamanda değişken, sınıfın genel arayüzünün bir parçası haline gelir, ki bu istenmeyen bir durumdur.