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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Grelek
Člen | 233
+
0
-

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
+
0
-

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
}
Grelek
Člen | 233
+
0
-

Moc děkuji, s OOP jsem (bohužel) začal až s Nette.

mkoubik
Člen | 728
+
0
-

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;
    }
}