Nápověda pro proměnnou basepresenteru

Tomas Trdla
Člen | 19
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

Myslim, že netbeans je tak hloupej, že pořád umí @var jen přes /* blokovej komentář…
Zkus ještě

/*
 * @var Context $database
 */
 public $database;
MajklNajt
Člen | 471
+
-2
-

@Polki ak to zmení na protected, nebude mu fungovať @inject

Polki
Člen | 553
+
-1
-

MajklNajt napsal(a):

@Polki ak to zmení na protected, nebude mu fungovať @inject

Proto jsem psal, že má místo @inject použít inject* metodu, jelikož NetBeans neumí přes anotaci inject napovídat.

Polki
Člen | 553
+
-1
-

CZechBoY napsal(a):

Myslim, že netbeans je tak hloupej, že pořád umí @var jen přes /* blokovej komentář…
Zkus ještě

/*
 * @var Context $database
 */
 public $database;

Umí, běžně používám komentář s dvěmi hvězdičkami /** :)

Tomas Trdla
Člen | 19
+
+1
-

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
+
0
-

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
+
0
-

@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
+
0
-

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