Hodnota vstupního parametru u inject metody

DefenestrationPraha
Člen | 99
+
0
-

Mám prezentér, jmenuje se SystemPresenter. Má v sobě injektovatelné parametry typu int.

   private int $versionMajor;
   private int $versionMinor;
   private int $versionBuild;

K nim mám definované metody

public function injectVersionMajor(int $versionMajor) : void {
        $this->versionMajor = $versionMajor;
    }

    public function injectVersionMinor(int $versionMinor) : void {
        $this->versionMinor = $versionMinor;
    }
    public function injectVersionBuild(int $versionBuild) : void {
        $this->versionBuild = $versionBuild;
    }

V konfiguračním souboru version.neon mám napsáno (tyto hodnoty vyplňuje automaticky hook skript při commitu/updatu):

parameters:
	version_major: 0
	version_minor: 2
	version_build: 118

a dále

decorator:
	App\Module\Admin\Presenters\SystemPresenter:
		inject: true

Při přístupu na prezentér vzniká chyba: Service ‚application.5‘ (type of App\Module\Admin\Presenters\SystemPresenter): Parameter $versionMajor in SystemPresenter::injectVersionMajor() has no class type or default value, so its value must be specified.

Jo, tomu rozumím. Odněkud to ty hodnoty musí vzít, u integerů nejspíš autowiring není z principu možný. Ale nenašel jsem nikde příklad ani dokumentaci, jak ty hodnoty pro inject() metody do konfiguráku zapsat. Všude, kde jsem našel inject metody coby příklad, se počítá s tím, že hodnotu dodá autowiring.

Jak mám inject() metodě v konfiguračním souboru dodat parametr? Zkoušel jsem naslepo různé syntaxe a na nic jsem nepřišel.

DefenestrationPraha
Člen | 99
+
0
-

Mimochodem, pokud by to někoho zajímalo: původně jsem měl ty proměnné public a injektoval je pomocí

	App\Module\Admin\Presenters\SystemPresenter:
		setup:
			- $versionMajor = %version_major%
			- $versionMinor = %version_minor%
			- $versionBuild = %version_build%

a fungovalo mi to dobře v běžném prostředí webu, ale nefunguje mi to v testu, když spustím Nette Tester. Tam se ty hodnoty nevyplní a pokus o spuštění prezentéru skončí stížností na to, že hodnoty proměnných musejí být definovány. A to i přesto, že version.neon se načítá.

Milo
Nette Core | 1283
+
+4
-

Nevím, jak specifikovat skalár pro inject metodu. Pro konstruktor to jde snadno. Anebo pokud bys ta čísla verzí potřeboval i jinde, mohlo by se vyplatit napsat službu App\Versions, té předat skaláry a injektovat ji.

David Grudl
Nette Core | 8108
+
0
-
DefenestrationPraha
Člen | 99
+
-1
-

David Grudl napsal(a):

Možná pomůže https://blog.nette.org/…anym-sluzbam

Omlouvám se, ale z toho článku mi to jasné není. Tam se předávají parametry do konstruktoru. Což je ta starší, dnes už nepříliš doporučovaná cesta.

Já bych chtěl ale využít tu novější, doporučovanou cestu se specializovanými inject*() metodami. Jenomže k tomu není nikde žádná dokumentace, ze které bych zjistil, jak jim předat parametry. Notabene skalární.

Už jsem toho zkusil hodně, teprve po pár hodinách marných pokusů jsem psal sem.

DefenestrationPraha
Člen | 99
+
0
-

Milo napsal(a):

Nevím, jak specifikovat skalár pro inject metodu. Pro konstruktor to jde snadno. Anebo pokud bys ta čísla verzí potřeboval i jinde, mohlo by se vyplatit napsat službu App\Versions, té předat skaláry a injektovat ji.

To je určitě možné řešení, v nejhorším jej použiju, díky.

Ale skalár pro inject metodu bude určitě občas poptávaný, ideálně by k němu měla existovat dokumentace, když už se tento způsob doporučuje pro injecting obecně…

David Grudl
Nette Core | 8108
+
+5
-

Odkud čerpáš, že inject je novější a doporučovaná cesta? Naopak, pokud to jde, používej konstruktor. Viz https://doc.nette.org/…dependencies#…

DefenestrationPraha
Člen | 99
+
0
-

David Grudl napsal(a):

Odkud čerpáš, že inject je novější a doporučovaná cesta? Naopak, pokud to jde, používej konstruktor. Viz https://doc.nette.org/…dependencies#…

Máš pravdu, najisto to nevím.

Ale architektonicky je to určitě o něco elegantnější. Když máš strom všelijakých předků a potomků, tak signatura konstruktoru potomka si s sebou musí táhnout všechny parametry signatury předka. Kdežto s inject* metodami to máš čistější a v případě některých tříd ani nemusíš psát explicitní konstruktor.

Také v případě, že se časem rozhodneš přidat do předka další závislost, nemusíš s použitím inject* metod přepisovat konstruktory všech potomků

Moje zkušenost je, že jak má metoda více než 3–4 parametry, začíná být nepřehledná, rád bych se tomu vyhnul.

David Grudl
Nette Core | 8108
+
0
-

Tak pak je volej jako jakékoliv jiné metody:

	App\Module\Admin\Presenters\SystemPresenter:
		setup:
			- injectVersionMajor(%version_major%)
DefenestrationPraha
Člen | 99
+
0
-

David Grudl napsal(a):

Tak pak je volej jako jakékoliv jiné metody:

	App\Module\Admin\Presenters\SystemPresenter:
		setup:
			- injectVersionMajor(%version_major%)

Děkuji, hned zítra ráno to vyzkouším.

DefenestrationPraha
Člen | 99
+
0
-

DefenestrationPraha napsal(a):

David Grudl napsal(a):

Tak pak je volej jako jakékoliv jiné metody:

	App\Module\Admin\Presenters\SystemPresenter:
		setup:
			- injectVersionMajor(%version_major%)

Děkuji, hned zítra ráno to vyzkouším.

Postup funguje. Můj hlavní problém to ale nevyřešilo. K tomu založím jiné vlákno, protože jde asi o otázku Nette Testeru.

DefenestrationPraha
Člen | 99
+
0
-

Vytvořil jsem nové vlákno ve fóru o Nette Testeru.

https://forum.nette.org/…neon-souboru

Je to zvláštní. NEON soubor s příslušnými inicializacemi se očividně na startu testu natáhne, ale ty inicializace se nevykonají. Raději dávám odkaz i sem, protože fórum o Nette Testeru není moc frekventované, poslední příspěvek tam byl před měsícem.

Editoval DefenestrationPraha (8. 8. 2022 9:19)

Šaman
Člen | 2634
+
0
-

DefenestrationPraha napsal(a):

Raději dávám odkaz i sem, protože fórum o Nette Testeru není moc frekventované, poslední příspěvek tam byl před měsícem.

Nemusíš, všechno je to jedno fórum, jen jiná sekce (narozdíl třeba od Dibi fóra, které je jinde). A novinky se zobrazují napříč všemi sekcemi: https://forum.nette.org/cs/recent-posts