Ako správne injektovať a kedy vlastne
- Čamo
- Člen | 798
Zdravím vás,
Môže mi prosím vás niekto vysvetliť čo som nepochopil na injektovaní?
Mám BasePresenter do ktorého cez anotáciu @injekt injektnem
Nette\Database\Context.
class BasePresenter extends ...presenter
{
/** @var Nette\Database\Context @inject */
$db;
No a v inom presentery chcem v konštruktore inštancovať nejakú modelovú triedu, ktorá v konštruktore čaká databázu.
class myPresenter extends BasePresenter
{
protected $myModel;
public function __construct()
{
$this->myModel = $new App\Model\myModel($this->db);
}
To mi vyhodí error „must be an instance of Nette\Database\Context, null given“
Čo robím zle a ako to mám robiť správne?
Editoval Čamo (23. 1. 2015 0:02)
- Oli
- Člen | 1215
Pokud použiješ inject anotaci,tak proměnná musí být public. Pokud nechceš použít public, tak použij buď inject metodu nebo kdyby/autowire, který funguje stejně jako inject anotace, ale proměnná může být protected.
Zároveň to musí být zaregistrovaný v neonu.
Btw. není lepší si do presenteru předat rovnou myModel, který bude mít závislost na databázi?
- David Matějka
- Moderator | 6445
a v konstruktoru nejsou dostupne zavislosti ziskavane pres
@inject
anotace nebo inject*
metody
Jinak jak rika @Oli – injectni si rovnou myModel
- Šaman
- Člen | 2666
Defaultní property je public, tím to není. (Ale raději to tam vždy
piš.)
Je to tím, že konstruktor v Nette slouží jen na
předávání závislostí. Pomocí anotací, nebo inject metod se totiž dá do
objektu něco předat až když je už vytvořený, tedy až po vykonání
konstruktoru.
Proto existuje i metoda startup()
, pro kterou platí stejné
zásady jako pro kontruktor (vždy volat startup()
předka), ale
která se spustí až když je presenter vytvořený a nastavený. Takže
použij tuto metodu (a doplň volání parent metody).
- Čamo
- Člen | 798
Ahá takže anotácie sú ešte neni dostupné. Takže buď startup alebo ijektovať do modelu.
Do modelu sa ako správne injektuje(best practise)? Tuším je tam nejaké obmedzenie nie? Ja to mám tak ako som písal, čo by vyžadovalo ten startup. Kdyby nepoznám…
Editoval Čamo (23. 1. 2015 10:53)
- Oli
- Člen | 1215
Nejlepsi je sito injectnout primo do toho modelu. Je to stejne jako by jsi to injectnul do presenter constructoru. Anotace injection v modelu nefungujou.
Pokud by jsi to chtel tak jak to mas ted, tak jen ten constructor prepis na startup. Nezapomen, ale volat predka. Ja bych to ale prepsal :-)