Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection

buffus
Člen | 101
+
0
-

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 | 1165
+
+6
-

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

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

@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í.

Matúš Matula
Člen | 257
+
0
-

@Mabar chapem, dakujem