Data z databáze v layoutu

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

Ahoj, mam nasledujici kod:

namespace App\FrontModule\Presenters;

use Nette;

abstract class BasePresenter extends Nette\Application\UI\Presenter {

    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database) {
        $this->database = $database;
    }

    protected function createComponentMenu() {
        $menu = new \App\Components\MenuControl($this->database);
        return $menu;
    }

}

Problem je, ze pri predani databaze v metode CreateComponentMenu() mi Nette vyhazuje chybu, ze ceka Nette\Database\Context ale dostal null. Nenapada vas proc ?

her-ur
Člen | 20
+
+1
-

Pravděpodobně v potomkovi nevoláš konstruktor.

U abstraktních presenterů je lepší používat na předávání závislostí inject metody (případně anotace). Jak na to najdeš v dokumentaci.

jbezdicek
Člen | 13
+
0
-

her-ur napsal(a):

Pravděpodobně v potomkovi nevoláš konstruktor.

U abstraktních presenterů je lepší používat na předávání závislostí inject metody (případně anotace). Jak na to najdeš v dokumentaci.

Ano, mas pravdu … uz sem se tim prokousal. Kazdopadne, kdyz zvolim cestu konstruktoru, v kazdem potomkovi bych parent konstruktoru musel predavat database context, coz se mi nelibi.

Pri pouziti anotace @inject zase musim ve vsech potomcich deklarovat promennou database s modifikatorem public, coz se mi taky trosku prici … Kazdopadne diky za odpoved v tak brzkych hodinach a diky za poposoupnuti! :-)

CZechBoY
Člen | 3608
+
+1
-

Inject metody musi byt public, ale property pak muze byt klidne private (je to jen setter metoda kterou vola di kontejner hned po vytvoreni tridy).

ViPEr*CZ*
Člen | 818
+
+1
-

Pri pouziti anotace @inject nemusíte definovat ve všech potomcích. Přeci když to dáte do předka, tak je hotovo. Ano musí být public. Ale to nevidím až zase tolik problém, když já neřídím vytváření instancí Presenterů a sotva kdy já nebo někdo další bude. U komponenty bych to ještě chápal, že ji děláte, aby byla znovupoužitelná a chcete mít property zapouzdřenou.