-
-
Notifications
You must be signed in to change notification settings - Fork 277
Expand file tree
/
Copy pathnette-container.texy
More file actions
80 lines (55 loc) · 3.67 KB
/
nette-container.texy
File metadata and controls
80 lines (55 loc) · 3.67 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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Nette DI Konteyner
******************
.[perex]
Nette DI, Nette'nin en ilginç kütüphanelerinden biridir. Son derece hızlı ve şaşırtıcı derecede kolay yapılandırılabilen derlenmiş DI konteynerlerini üretebilir ve otomatik olarak güncelleyebilir.
DI konteynerinin oluşturması gereken servislerin şeklini genellikle [NEON formatı|neon:format] yapılandırma dosyaları kullanarak tanımlarız. [önceki bölümde|container] manuel olarak oluşturduğumuz konteyner şöyle yazılırdı:
```neon
parameters:
db:
dsn: 'mysql:'
user: root
password: '***'
services:
- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
- ArticleFactory
- UserController
```
Yazım gerçekten kısa ve özdür.
`ArticleFactory` ve `UserController` sınıflarının yapıcılarında bildirilen tüm bağımlılıklar, Nette DI tarafından sözde [autowiring|autowiring] sayesinde otomatik olarak bulunur ve iletilir, bu nedenle yapılandırma dosyasında hiçbir şey belirtmeye gerek yoktur. Bu nedenle, parametreler değişse bile yapılandırmada hiçbir şeyi değiştirmeniz gerekmez. Nette konteyneri otomatik olarak yeniden oluşturur. Orada tamamen uygulama geliştirmeye odaklanabilirsiniz.
Bağımlılıkları setter'lar kullanarak iletmek istiyorsak, bunun için [setup |services#Setup] bölümünü kullanırız.
Nette DI, konteynerin PHP kodunu doğrudan üretir. Sonuç, açıp inceleyebileceğiniz bir `.php` dosyasıdır. Bu sayede konteynerin tam olarak nasıl çalıştığını görebilirsiniz. Ayrıca IDE'de hata ayıklayabilir ve adım adım ilerleyebilirsiniz. Ve en önemlisi: üretilen PHP son derece hızlıdır.
Nette DI ayrıca sağlanan arayüze dayalı olarak [fabrikalar|factory] için kod üretebilir. Bu nedenle, `ArticleFactory` sınıfı yerine uygulamada sadece bir arayüz oluşturmamız yeterli olacaktır:
```php
interface ArticleFactory
{
function create(): Article;
}
```
Örneğin tamamını [GitHub'da|https://github.com/nette-examples/di-example-doc] bulabilirsiniz.
Bağımsız Kullanım
-----------------
Nette DI kütüphanesini bir uygulamaya dağıtmak çok kolaydır. Önce Composer ile kurarız (çünkü zip indirmek çooook eski moda):
```shell
composer require nette/di
```
Aşağıdaki kod, `config.neon` dosyasında saklanan yapılandırmaya göre bir DI konteyneri örneği oluşturur:
```php
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;
```
Konteyner yalnızca bir kez üretilir, kodu önbelleğe (`__DIR__ . '/temp'` dizini) yazılır ve sonraki isteklerde yalnızca buradan yüklenir.
Servisleri oluşturmak ve almak için `getService()` veya `getByType()` metotları kullanılır. Bu şekilde `UserController` nesnesini oluştururuz:
```php
$controller = $container->getByType(UserController::class);
$controller->someMethod();
```
Geliştirme sırasında, herhangi bir sınıf veya yapılandırma dosyası değiştiğinde konteynerin otomatik olarak yeniden oluşturulduğu otomatik yenileme modunu etkinleştirmek faydalıdır. `ContainerLoader` yapıcısında ikinci argüman olarak `true` belirtmek yeterlidir.
```php
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
```
Nette Framework ile Kullanım
----------------------------
Gösterdiğimiz gibi, Nette DI kullanımı Nette Framework ile yazılmış uygulamalarla sınırlı değildir, sadece 3 satır kodla herhangi bir yere dağıtabilirsiniz. Ancak, Nette Framework'te uygulamalar geliştiriyorsanız, konteynerin yapılandırılması ve oluşturulmasından [Bootstrap |application:bootstrapping#DI Konteyner Yapılandırması] sorumludur.