Előadók összeállítása tulajdonságokból
Ha ugyanazt a kódot több prezenterben kell implementálnunk (pl. annak ellenőrzése, hogy a felhasználó be van-e jelentkezve), akkor csábító, hogy a kódot egy közös ősben helyezzük el. A második lehetőség az egycélú tulajdonságok létrehozása.
Ennek a megoldásnak az az előnye, hogy minden egyes prezenter csak azokat a tulajdonságokat használhatja, amelyekre ténylegesen szüksége van, míg a többszörös öröklés nem lehetséges a PHP-ben.
Ezek a vonások kihasználhatják azt a tényt, hogy a prezenter létrehozásakor az összes injektált metódus egymás után hívódik meg. Csak arra kell ügyelni, hogy minden egyes inject metódus neve egyedi legyen.
A vonások az inicializálási kódot az onStartup vagy onRender eseményekbe akaszthatják.
Példák:
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);
};
}
}
Az előadó egyszerűen felhasználja ezeket a tulajdonságokat:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}