Problém s vytvářením objektu modelu v kostruktoru presenteru

- Grelek
- Člen | 233
Zdravím,
V HomepagePresenteru vytvářím objekt modelu
HomepageFacade a všechno mi jde. HomepagePresenter
dědí od BasePresenteru, který by měl vypsat do šablony
layout.latte, od které pak všechny ostatní šablony dědí, data
o vybraných uživatelích.
Problém nastává, když chci v BasePresenteru vytvořit
objekt modelu AccountsFacade, který je ve stejné složce jako
HomepageFacade. Objekty vytvářím konstruktorem. Když chci tedy
v BasePresenteru předat do šablony proměnnou, hlásí to chybu
Call to a member function getAccounts() on a non-object.
HomepagePresenter:
class HomepagePresenter extends BasePresenter
{
private $homepageFacade;
function __construct(\HomepageFacade $homepageFacade)
{
$this->homepageFacade = $homepageFacade;
}
// tady to funguje, už můžu používat model jak chci
}
BasePresenter:
class BasePresenter extends Nette\Application\UI\Presenter
{
private $accountsFacade;
function __construct(\AccountsFacade $accountsFacade)
{
$this->accountsFacade = $accountsFacade;
// nezahlásí žádnou chybu
}
public function renderLayout()
{
$this->template->fastContact = $this->accountsFacade->getContactsAccounts();
// FATAL ERROR: Call to a member function getAccounts() on a non-object
}
}
Oba dva presentery jsou ve stejné složce a mají nastavený
namespace na FrontModule.

- llook
- Člen | 407
No jasně, protože tím konstruktorem v HomepagePresenter předefinuješ konstruktor z BasePresenter. Je to stejné jako s jakoukoli jinou metodou, vždy se volá jen ta z potomka (pokud v něm je) a na něm je, aby případně zavolal původní metodu z předka:
class HomepagePresenter extends BasePresenter
{
private $homepageFacade;
function __construct(\AccountsFacade $accountsFacade, \HomepageFacade $homepageFacade)
{
parent::__construct($accountsFacade);
$this->homepageFacade = $homepageFacade;
}
// tady to funguje, už můžu používat model jak chci
}

- mkoubik
- Člen | 728
Pokud používáš Nette 2.1-dev tak je lepší použít inject-metody aby ti ten konstruktor takhle nenarůstal. PresenterFactory ti zavolá všechny metody začínající na „inject“.
HomepagePresenter
class HomepagePresenter extends BasePresenter
{
private $homepageFacade;
function injectHomepageFacade(\HomepageFacade $homepageFacade)
{
$this->homepageFacade = $homepageFacade;
}
}
BasePresenter
class BasePresenter extends Nette\Application\UI\Presenter
{
private $accountsFacade;
function injectAccountsFacade(\AccountsFacade $accountsFacade)
{
$this->accountsFacade = $accountsFacade;
}
}