Skip to content
Browse files

UI\Presenter: setContext() renamed to injectPrimary() and PresenterFa…

…ctory calls all methods prefixed with "inject"
  • Loading branch information...
1 parent eefd645 commit cc4d60bd33404df11b1c574f8db9107bad787922 @dg dg committed
Showing with 5 additions and 3 deletions.
  1. +4 −2 Nette/Application/PresenterFactory.php
  2. +1 −1 Nette/Application/UI/Presenter.php
View
6 Nette/Application/PresenterFactory.php
@@ -61,8 +61,10 @@ public function __construct($baseDir, Nette\DI\Container $container)
public function createPresenter($name)
{
$presenter = $this->container->createInstance($this->getPresenterClass($name));
- if (method_exists($presenter, 'setContext')) {
- $this->container->callMethod(array($presenter, 'setContext'));
+ foreach (array_reverse(get_class_methods($presenter)) as $method) {
+ if (substr($method, 0, 6) === 'inject') {
+ $this->container->callMethod(array($presenter, $method));
+ }
}
return $presenter;
}
View
2 Nette/Application/UI/Presenter.php
@@ -1359,7 +1359,7 @@ public function getFlashSession()
- final public function setContext(Nette\DI\Container $context)
+ final public function injectPrimary(Nette\DI\Container $context)
{
$this->context = $context;
if ($this->invalidLinkMode === NULL) {

14 comments on commit cc4d60b

@Vrtak-CZ
Nette Foundation member

Why "primary" and no "context"?

@janmarek

zajímavé. injektuj primární? primární co?

@juzna
Nette Foundation member

Nebylo by lepsi, kdyby metody injectX volal sam kontejner v ramci createInstance, tedy ze by to fungovalo nejen na presentery ale na vsechny sluzby/objekty vytvorene kontejnerem?

@Majkl578
Nette Foundation member

Název "primární" se mi zdá zavádějící, proč ne injectContext?
A celkově mi přijde volat pouze metody začínající na inject jako poměrně omezující. Co když má presenter závislost, kterou pak chci mít možnost později měnit (např. translator, tj. setTranslator, volat opakovaně injectTranslator je zavádějící), ale zároveň ji chci autowirovat? Anotace @Inject se mi zdá vhodnější.

@fprochazka
Nette Foundation member

Chtělo by to dořešit pull od @juzna, aby se daly používat @inject annotace :)

@dg
Nette Foundation member

Nebylo by lepsi, kdyby metody injectX volal sam kontejner v ramci createInstance

Zvažoval jsem to, možná by to chtělo nějaký přepínač.

zajímavé. injektuj primární? primární co?

Rád použiju lepší název, ale nic jiného mě nenapadlo. Samotné inject() bych nechal pro vlastní presentery, injectBase pro base presentery.

Název "primární" se mi zdá zavádějící, proč ne injectContext?

Metoda inject() bude přebírat všechny závislosti, context je tam jen shodou okolností. Inject je každopádně pro závislosti, které se nastaví jen jednou.

Chtělo by to dořešit pull od @juzna, aby se daly používat @inject annotace

Pokud metoda začíná prefixem inject, proč bych jí potřeboval psát nějakou anotaci?

@fprochazka
Nette Foundation member

Pokud metoda začíná prefixem inject, proč bych jí potřeboval psát nějakou anotaci?

@dg: protože setTranslator()

@dg
Nette Foundation member

A jakou to má pro programátora výhodu? Pokud v API vidím funkci setTranslator(), je mi jasné, že pokud chci překládat, zavolám ji a nastavím translator. K čemu mi bude anotace?

Viz #638: when we use setter injection, we should somehow declare that these setters should be invoked for proper function of newly created object. We can either write a comment above the class saying "dont forget to inject EntityManager by calling setEntityManager", or we can just write @inject annotation above.

Je setTranslator() něco, co musí být zavoláno, aby nově vytvořený objekt byl ok?

@juzna
Nette Foundation member

Dat si @inject pred setTranslator() je pouze zjednoduseni, abych to nemusel psat do config.neon. U toho translatoru by mohlo byt napr @optional - pokud by DI Container vedel o translatoru, tak by ho tam nacpal. Pokud by nebyl, no problemo ;)

@vojtech-dobes
Nette Foundation member

Celý posun je v tom, že ačkoliv se doteď uvažovalo: setter => nepovinný, konstruktor => povinný; s metodou inject se to mění. nject je "povinný" setter. Klasické settery tak zůstávají nepovinnými. Doufám, že nekalím vodu :)

@dg
Nette Foundation member

Konfigurace je něco, co nemůže třída předjímat. Tohle je potřeba mít na zřeteli, protože balancujeme na tenké hraně. Konfigurace proto patří do config.neon, nikoliv do kódu. Na obou místech je to otázka několika písmenek.

Anotace @optional je u setterů by default.

@dg
Nette Foundation member

@vojtech-dobes: přesně tak, inject je náhražka pro situace, kde kvůli dědičnosti selhává konstruktor.

@dg
Nette Foundation member

Abychom si rozuměli, dovedu si představit, že u property bude anotace @inject, ale její naplnění provede nějaká magická metoda v Nette\Object, nikoliv kontejner. Tj. anotace pro jazyk, anotace pro objekt samotný.

Versus

Anotace @inject u metody, že ji má tvůrce objektu (třeba kontejner) určitě zavolat hned po konstruktoru. Zde se mi zdá praktičtější rovnou metodu nazvat inject().

@tomaswindsor

Ohledně alternativního názvu k injectPrimary, co např. injectEssentials?

Please sign in to comment.
Something went wrong with that request. Please try again.