Problém s vytvářením objektu modelu v kostruktoru presenteru
- Grelek
- Člen | 233
Zdravím,
V HomepagePresenter
u vytvářím objekt modelu
HomepageFacade
a všechno mi jde. HomepagePresenter
dědí od BasePresenter
u, 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 BasePresenter
u vytvořit
objekt modelu AccountsFacade
, který je ve stejné složce jako
HomepageFacade
. Objekty vytvářím konstruktorem. Když chci tedy
v BasePresenter
u 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;
}
}