Inject Yöntemleri ve Öznitelikleri
Bu makalede, Nette çerçevesinde bağımlılıkları sunum yapanlara aktarmanın çeşitli yollarına
odaklanacağız. Tercih edilen yöntem olan kurucu ile inject
yöntemleri ve nitelikleri gibi diğer seçenekleri
karşılaştıracağız.
Sunucular için de bağımlılıkların kurucu kullanılarak aktarılması tercih edilen yoldur. Ancak, diğer sunum yapanların miras aldığı ortak bir ata oluşturursanız (örn. BasePresenter) ve bu atanın da bağımlılıkları varsa, yapıcı cehennemi dediğimiz bir sorun ortaya çıkar. Bu sorun, inject yöntemleri ve nitelikleri (ek açıklamalar) içeren alternatif yöntemler kullanılarak atlatılabilir.
inject*()
Yöntemler
Bu, ayarlayıcıları kullanan bir bağımlılık aktarma biçimidir. Bu ayarlayıcıların adları inject önekiyle başlar. Nette DI, sunum örneğini oluşturduktan hemen sonra bu tür adlandırılmış yöntemleri otomatik olarak çağırır ve gerekli tüm bağımlılıkları bunlara aktarır. Bu nedenle public olarak bildirilmelidirler.
inject*()
metotları, birden fazla metoda bir tür yapıcı uzantısı olarak düşünülebilir. Bu sayede,
BasePresenter
bağımlılıkları başka bir yöntem aracılığıyla alabilir ve yapıcıyı torunları 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;
}
}
Sunum yapan kişi herhangi bir sayıda inject*()
yöntemi içerebilir ve her biri herhangi bir sayıda parametreye
sahip olabilir. Bu, sunum yapan kişinin özelliklerden
oluştuğu ve her birinin kendi bağımlılığını gerektirdiği durumlar için de harikadır.
Inject
Nitelikler
Bu, özelliklere enjeksiyonun bir şeklidir. Hangi özelliklerin enjekte edilmesi gerektiğini belirtmek yeterlidir ve Nette DI, sunum örneğini oluşturduktan hemen sonra bağımlılıkları otomatik olarak geçirir. Bunları eklemek için public olarak bildirmek gerekir.
Özellikler bir öznitelikle işaretlenir: (daha önce /** @inject */
ek açıklaması kullanılıyordu)
use Nette\DI\Attributes\Inject; // bu satır önemlidir
class MyPresenter extends Nette\Application\UI\Presenter
{
#[Inject]
public Cache $cache;
}
Bağımlılıkları aktarmanın bu yönteminin avantajı çok ekonomik bir gösterim biçimine sahip olmasıydı. Ancak, yapıcı özellik tanıtımının kullanılmaya başlanmasıyla birlikte, yapıcıyı kullanmak daha kolay görünmektedir.
Öte yandan, bu yöntem genel olarak bağımlılıkları özelliklere aktarmakla aynı eksikliklerden muzdariptir: değişkendeki değişiklikler üzerinde hiçbir 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.