databázová proměnná v layout.latte

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

Ahoj, chtěl bych si do @layout.latte vložit proměnnou z databáze (například název článku nebo webu).
Do BasePresenteru jsem dal metodu beforeRender a konstruktor.

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

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

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

    public function beforeRender() {
        parent::beforeRender();
        $this->template->webName = $this->database->query(...);
}

V ostatních prezenterech mám něco podobného. Vždycky si zavolám v konstruktoru databázi.
Potíž je v tom, že ve všech prezenterech mám nastavenou proměnnou $this->database jako private.
V BasePresenteru pak nenajde metodu $this->database->query když je i zde nastavená jako private.

Moje otázka zní, kde může být chyba a jak to lze napsat případně líp. Napadlo mě mít $this->database jako protected, ale nevim zda by to nějak nenarušilo bezpečnost nette.

Díky.

Šaman
Člen | 2666
+
0
-

Jak jako že si v ostastních presenterech zavoláš v konstruktoru databázi? Voláš konstruktort parenta? To pak tu databázi vlastně nastavuješ dvakrát – pokaždé s viditelností jen pro vlastní třídu. Takže než se dostaneš k tomu beforeRender, máš už nastavenou private databázi potomka.
No, zkrátka, protected žádnou bezpečnost nenaruší. A nastavovat do stejné proměnné v abstraktním předkovi i v potomkovi je nesmysl. Takže nejčistější je nastavit databázi v předkovi a jinde už ji jen využivat. (Resp. nejčistější je mít db jen v modelu a ten injectovat do presenteru, ale to už je jiná problematika.)
Případně v presenterech nemusíš používat konstruktor, ale anoitaci inject. Tam je problém, že daná property už musí být public, což sice bezpečnost taky nenaruší (když neděláš kraviny), ale akademicky čisté už to není.

ondrusu
Člen | 118
+
0
-

Děkuji za radu, to že si volám dvakrát databázi, to jsem si právě myslel, že to teď předělám, protože před tím jsem tu DB v BasePresenteru nepotřeboval – teď už ano.
Děkuji, pomohlo mi to.