Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection
- buffus
- Člen | 101
Ahoj, rád bych poprosil o nějakou jednoduchou, ale konkrétní ukázku kódu implementace DI na nette/web-projectu, abych získal v HomepagePresenteru hodnotu parametru, kterou si uvedu v configuračním souboru local.neon pod položkou parameters.
Na PHP 7.2 mi běží nette/web-project v3.0.3.
Pokud v projektu do local.neon přidám
parameters:
foo:
first: 'fooFirst'
a do HomepagePresenter.php přidám (vím, že zapovězené
$this->context
, ale jinak tu hodnotu parametru teď neumím do
presenteru dostat)
public function renderDefault() {
echo ($this->context->parameters['foo']['first']); // vypíše fooFirst
}
tak to zatím funguje, ale vím, že to není správné řešení.
Dokonce, pokud nyní upravím v aktuálním nette/web-project composer.json na
"minimum-stability": "dev"
tak po composer update
vyskočí za použití
$this->context
varování:
Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection
což je předpokládám důsledkem tohoto commitu
Za ten commit jsem rád, protože mě konečně donutí
$this->context
přestat používat, ale můžete mi prosím
někdo ukázat, jak správně s použitím DI ten parametr do toho presenteru
dostanu?
Editoval buffus (7. 3. 2020 21:56)
- Marek Bartoš
- Nette Blogger | 1274
Zaregistruj presenter do služeb manuálně a předej mu parametr stejně jako bys předával (neautowirovanou) službu
services:
- App\Presenters\HomepagePresenter(%foo.first%)
class HomepagePresenter extends Presenter {
public function __construct($fooFirst) {}
}
Editoval Mabar (7. 3. 2020 23:56)
- Matúš Matula
- Člen | 257
@Mabar vies prosim poradit aka je best practice pre takyto kod?
protected function createComponentContactForm(string $name)
{
return $this->context->createService('contactForm.control');
}
je potrebne si injectnut tovarnicku na danu sluzbu? alebo je OK v tomto pripade si injectnut cely context?
- Marek Bartoš
- Nette Blogger | 1274
@MatúšMatula Tvá ukázka skrývá závislost na službě. Kdybys službu odstranil, nedozvíš se o chybě dokud komponentu nevyužiješ. Factory je v tomhle případě správné řešení.