Decorator -nedaří se injektovat parametr do vlastní třídy

m.brecher
Generous Backer | 863
+
0
-

Ahoj,

s konfigurací v neon souborech se teprve seznamuji a narazil jsem na tento problém:

Pomocí dekoratoru jsem v common.neon předal parametr appDir do BasePresenteru:

common.neon:

decorator:
	App\Presenters\BasePresenter:
		setup:
			- $appDir = %appDir%

Property presenteru jsem definoval v BasePresenteru:

abstract class BasePresenter extends Presenter
{
    public string $appDir;
	.......
}

Tohle funguje.

Nyní jsem obdobný postup zkusil pro předání $basePath do jedné mojí Utility třídy pro formátování textu (kvůli href v odkazech):

common.neon – definoval jsem si konfigurační parametr basePath, který používám na více místech (tohle funguje):

parameters:
	basePath: @Nette\Http\Request::getUrl()::getBasePath()

Ve vlastní třídě jsem si definoval property $basePath:

class TextHtmlizer
{
    public ?string $basePath = null;
	........
}

TextHtmlizer jsem zaregistroval jako službu:

services.neon:

services:
	- App\Utils\TextHtmlizer

Nyní již jenom potřebuji injektovat/autowirovat parametr basePath v common.neon do mojí třídy ;)

Zkusil jsem decorator analogicky jako u příkladu výše s BasePresenterem:

common.neon:

decorator:
	App\Utils\TextHtmlizer:
		setup:
			- $basePath = %basePath%

Ačkoliv decorator předá parametr do presenteru, předání do anonymní služby nefunguje.

Sice se mě podařilo získat $basePath v třídě přes Nette\Http\Request, ale chtěl bych se naučit i předání parametrů z konfigurace.

Poraďte kudy se vydat – měl bych zkusit službu pojmenovat, aby se dala použít pro decorator? Nebo je vhodné na to jít nějak jinak ?

Díky za jakékoliv rady ideálně s ukázkou kódu.

Editoval m.brecher (8. 2. 2022 19:06)

Marek Bartoš
Nette Blogger | 1260
+
+2
-

Tvůj zápis by imho fungovat měl, určitě instanci získáváš jako službu z DI, nevytváříš si ji přes new?


A abys to měl jednodušší: DecoratorExtension slouží pro konfiguraci více služeb podle jejich typu, pro jednu službu ho nepotřebuješ. Mimo base třídy je též lepší použít konstruktor, jestliže je konfigurace povinná.

services:
	- App\Utils\TextHtmlizer(%basePath%)
class TextHtmlizer
{
    private string $basePath;
	public function __construct(string $basePath)
	{
		$this->basePath = $basePath;
	}
}

Editoval Marek Bartoš (8. 2. 2022 21:34)

m.brecher
Generous Backer | 863
+
0
-

Marek Bartoš napsal(a):

Tvůj zápis by imho fungovat měl, určitě instanci získáváš jako službu z DI, nevytváříš si ji přes new?


A abys to měl jednodušší: DecoratorExtension slouží pro konfiguraci více služeb podle jejich typu, pro jednu službu ho nepotřebuješ. Mimo base třídy je též lepší použít konstruktor, jestliže je konfigurace povinná.

services:
	- App\Utils\TextHtmlizer(%basePath%)
class TextHtmlizer
{
    private string $basePath;
	public function __construct(string $basePath)
	{
		$this->basePath = $basePath;
	}
}

Díky moc, mezitím mě to také napadlo, že by se to dalo předat přímo do konstruktoru ve službách a dekorator je na to zbytečně silný nástroj. Také si myslím, že by dekorator měl umět předat parametr i do mojí třídy, nejenom do presenteru, proč to nefunguje zkusím vypátrat.

m.brecher
Generous Backer | 863
+
0
-

@MarekBartoš předání dekoratorem do mojí třídy funguje, měl jsem tam chybu ;) Nicméně předat parametr je šikovnější pomocí konstruktoru v sekci service.

Editoval m.brecher (9. 2. 2022 3:35)