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.