Decorator -nedaří se injektovat parametr do vlastní třídy
- m.brecher
- Generous Backer | 863
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
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
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.