databázová proměnná v layout.latte
- ondrusu
- Člen | 118
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
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í.