Nápověda pro proměnnou basepresenteru
- Tomas Trdla
- Člen | 19
Zdravím,
dotaz je pouze kosmetický, funkcionalitě nebrání.
Do BasePresenteru jsem si přidal databázi, abych ji nemusel vkládat do každého konstruktoru presenterů.
namespace App\Presenters;
use Nette;
use Nette\Database\Context;
abstract class BasePresenter extends Nette\Application\UI\Presenter {
/**
* @var Nette\Database\Context $database
* @inject
*/
public $database;
Když ji poté v Presenteru chci využít, tak mi prostředí (NetBeans IDE
8.2) nabídne pouze $this->database
ale dál už nic. Nicméně
případnou funkci načtení z db provede „bez keců“. Např.:
$data = $this->database->table('test')->
where('nazev = ?', $values['nazev'])->
count();
S tím, že presenter vypádá např. takhle:
use Nette\Database\Context;
final class TestPresenter extends BasePresenter {
Ve zkratce mi jde tedy pouze o to, že v pracovním presenteru mi prostředí nenapovídá a musím vše psát ručně, nebo hledat přesnou syntaxi na jiných místech, zkopírovat a upravit, což značně zpomaluje.
Editoval Tomas Trdla (22. 7. 2019 14:42)
- Polki
- Člen | 553
Do BasePresenteru jsem si přidal databázi, abych ji nemusel vkládat do každého konstruktoru presenterů.
Práce s databází by neměla být odpovědností presenterů, ale modelů.
/**
* @var Nette\Database\Context $database
* @inject
*/
public $database;
Když je použitá anotace @inject , tak to znamená, že není možné vynutit datový typ. Ono NetBeans to proto pak bere tak, že neví, co tam je za datový typ a nemůže ti našeptávat.
fixace je možná pomocí getteru místo @inject viz: Tady
Takže by to vypadalo asi takto:
namespace App\Presenters;
use Nette;
use CustomRoleManager\CustomRoleManager;
use Nette\Database\Context;
abstract class BasePresenter extends Nette\Application\UI\Presenter {
/**
* @var Context $database
*/
public $database;
public function injectContext(Context $database)
{
$this->database= $database;
}
Lepší je to ale pořád v konstruktoru, jelikož v něm se to plní hned na začátku a ne až někdy, kdy už je vytvořena instance. Pokud se bojíš ConstructorHell, tak si můžeš udělat třídu FooDependencies viz: Zde nadpis další možnosti
Editoval Polki (22. 7. 2019 14:56)
- Tomas Trdla
- Člen | 19
Práce s databází by neměla být odpovědností presenterů, ale modelů.
Užitečná informace, děkuji. Tady jsem si řikal, že nebudu vytvářet model kvůli 4 řádkům kodu (kontrola duplicity + insert)
Jinak navržený kód nezafungoval. Všimnul jsem si, že se mi to stává
i ve form factory s našeptáváním pro
Nette\Application\UI\Form
.
Editoval Tomas Trdla (22. 7. 2019 15:19)
- kocourPB
- Člen | 47
Ahoj, skus to zapisat takto:
namespace App\Presenters;
use Nette;
use Nette\Database\Context;
abstract class BasePresenter extends Nette\Application\UI\Presenter {
/** @var Nette\Database\Context @inject */
public $database;
// ...
}
Ak to nepomoze, doporucil by som pouzivat PHPStorm s pluginom pre Nette. Ak teda nemas nejaku urgentnu potrebu pouzivat NetBeans. ;)
- Polki
- Člen | 553
kocourPB napsal(a):
Ak teda nemas nejaku urgentnu potrebu pouzivat NetBeans. ;)
Většinou používají NetBeans jelikož je zadarmo.
Tomas Trdla napsal(a):
Jinak navržený kód nezafungoval.
Zkus předělat komentář na:
/** @var Context */
protected $database;
Taky slovíčko protected je důležité, jelikož při public ti může kdokoli měnit onu proměnnou a je dost možné, že právě proto se NetBeans nechce.
Pokud ani to nezafunguje, tak pak už jedině konstruktor, nebo jak píše kocourPB PHPStorm od JetBrains. Ten umí fakt všechno.
- Tomas Trdla
- Člen | 19
Polki napsal(a):
kocourPB napsal(a):
Ak teda nemas nejaku urgentnu potrebu pouzivat NetBeans. ;)Většinou používají NetBeans jelikož je zadarmo.
Jojo, mam to jen takový side-job občas ve volném čase na přivýdělek, tak se mi nechce používat placené platformy, a převážně na tom webu dělám sám.
Vyzkoušel jsem všechny varianty a nic nepomáhá, tak si začínám řikat, že chyba bude asi v NetBeans a ne v syntaxi.
A skutečně je pro inject potřeba /**
Editoval Tomas Trdla (23. 7. 2019 9:10)
- Tomas Trdla
- Člen | 19
Polki napsal(a):
Práce s databází by neměla být odpovědností presenterů, ale modelů.
Nakonec jsem přecejen dal na tvoji radu a místo db jsem do BasePresenteru
dal model, který se stará o zpracování dat. Ale přijde mi zvláštní, že
s touhle syntaxí už našeptávání funguje (i s použitím
use
místo vypsání celé cesty).
/**
* @var \App\Model\DataProcessing $DataProcessing
* @inject
*/
public $DataProcessing;
a také musí být public
místo protected
Editoval Tomas Trdla (23. 7. 2019 10:56)
- esorimer
- Člen | 114
@inject ani public určitě nemají na našeptávání vliv. V NetBeans mi to funguje s obojím bez problémů.
Měl jsem ale s našeptáváním potíže po upgradu NetBeans. Nepomohla ani reinstalace, smazání všech netbeans configuráků co jsem našel a nová instalace, prostě nic. Nakonec se problém vyřešil po komplentí reinstalaci PC (ne kvůli NetBeansum :-) a nainstalování NetBeans 11.0.
http://imgWorld.cz/stkvj95Sox.png
Editoval esorimer (23. 7. 2019 11:15)
- Polki
- Člen | 553
esorimer napsal(a):
@inject ani public určitě nemají na našeptávání vliv. V NetBeans mi to funguje s obojím bez problémů.
Já mám právě jinou zkušenost :D Řešil jsem proč mi někdy NetBeans našeptává a někdy ne a zjistil jsem, že právě při @inject a při public modifikátoru s tím měl NetBeans problém, zatímco při public jen někdy, ale při @inject vždy.
Každopádně očividně se NetBeans chovají pokaždé jinak jak se jim chce. Asi podle toho, jak jim zrovna naroste stonek :D