-
-
Notifications
You must be signed in to change notification settings - Fork 277
Expand file tree
/
Copy pathinject-method-attribute.texy
More file actions
61 lines (42 loc) · 3.34 KB
/
inject-method-attribute.texy
File metadata and controls
61 lines (42 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Inject Metotları ve Nitelikleri
*******************************
.[perex]
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ı |dependency-injection:passing-dependencies#Yapıcı ile İletme] 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 |dependency-injection:passing-dependencies#Constructor Hell] 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ı |dependency-injection:passing-dependencies#Setter ile İletme] 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:
```php
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 |presenter-traits] ve her birinin kendi bağımlılığını gerektirdiği durumlarda da harika çalışır.
`Inject` Nitelikleri
====================
Bu, [özelliğe enjekte etme |dependency-injection:passing-dependencies#Değişken Ayarlayarak] ş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)
```php
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 |https://blog.nette.org/tr/php-8-0-complete-overview-of-news#toc-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.