Nette Documentation Preview

syntax
Presenter'ları trait'lerden oluşturma
*************************************

.[perex]
Birden fazla presenter'da aynı kodu uygulamamız gerekiyorsa (örneğin, kullanıcının oturum açıp açmadığını doğrulamak), kodu ortak bir ataya yerleştirmek bir seçenektir. İkinci seçenek, tek amaçlı [trait'ler |nette:introduction-to-object-oriented-programming#Traitler] oluşturmaktır.

Bu çözümün avantajı, her presenter'ın yalnızca gerçekten ihtiyaç duyduğu trait'leri kullanabilmesidir, oysa PHP'de çoklu kalıtım mümkün değildir.

Bu trait'ler, presenter oluşturulduğunda tüm [inject metotlarının |inject-method-attribute#inject Metotları] sırayla çağrılması gerçeğinden yararlanabilir. Yalnızca her inject metodunun adının benzersiz olduğundan emin olmak gerekir.

Trait'ler, başlatma kodunu [onStartup veya onRender |application:presenters#Olaylar] olaylarına bağlayabilir.

Örnekler:

```php
trait RequireLoggedUser
{
	public function injectRequireLoggedUser(): void
	{
		$this->onStartup[] = function () {
			if (!$this->getUser()->isLoggedIn()) {
				$this->redirect('Sign:in', $this->storeRequest());
			}
		};
	}
}

trait StandardTemplateFilters
{
	public function injectStandardTemplateFilters(TemplateBuilder $builder): void
	{
		$this->onRender[] = function () use ($builder) {
			$builder->setupTemplate($this->template);
		};
	}
}
```

Presenter daha sonra bu trait'leri basitçe kullanır:

```php
class ArticlePresenter extends Nette\Application\UI\Presenter
{
	use StandardTemplateFilters;
	use RequireLoggedUser;
}
```


{{sitename: Best Practices}}

Presenter'ları trait'lerden oluşturma

Birden fazla presenter'da aynı kodu uygulamamız gerekiyorsa (örneğin, kullanıcının oturum açıp açmadığını doğrulamak), kodu ortak bir ataya yerleştirmek bir seçenektir. İkinci seçenek, tek amaçlı trait'ler oluşturmaktır.

Bu çözümün avantajı, her presenter'ın yalnızca gerçekten ihtiyaç duyduğu trait'leri kullanabilmesidir, oysa PHP'de çoklu kalıtım mümkün değildir.

Bu trait'ler, presenter oluşturulduğunda tüm inject metotlarının sırayla çağrılması gerçeğinden yararlanabilir. Yalnızca her inject metodunun adının benzersiz olduğundan emin olmak gerekir.

Trait'ler, başlatma kodunu onStartup veya onRender olaylarına bağlayabilir.

Örnekler:

trait RequireLoggedUser
{
	public function injectRequireLoggedUser(): void
	{
		$this->onStartup[] = function () {
			if (!$this->getUser()->isLoggedIn()) {
				$this->redirect('Sign:in', $this->storeRequest());
			}
		};
	}
}

trait StandardTemplateFilters
{
	public function injectStandardTemplateFilters(TemplateBuilder $builder): void
	{
		$this->onRender[] = function () use ($builder) {
			$builder->setupTemplate($this->template);
		};
	}
}

Presenter daha sonra bu trait'leri basitçe kullanır:

class ArticlePresenter extends Nette\Application\UI\Presenter
{
	use StandardTemplateFilters;
	use RequireLoggedUser;
}