Permalink
Browse files

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

…ctory calls all methods prefixed with "inject"
  • Loading branch information...
dg committed May 9, 2012
1 parent eefd645 commit cc4d60bd33404df11b1c574f8db9107bad787922
Showing with 5 additions and 3 deletions.
  1. +4 −2 Nette/Application/PresenterFactory.php
  2. +1 −1 Nette/Application/UI/Presenter.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;
}
@@ -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

This comment has been minimized.

Copy link
Contributor

Vrtak-CZ replied May 10, 2012

Why "primary" and no "context"?

@janmarek

This comment has been minimized.

Copy link
Contributor

janmarek replied May 10, 2012

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

@juzna

This comment has been minimized.

Copy link
Contributor

juzna replied May 10, 2012

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

This comment has been minimized.

Copy link
Contributor

Majkl578 replied May 10, 2012

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

This comment has been minimized.

Copy link
Contributor

fprochazka replied May 10, 2012

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

@dg

This comment has been minimized.

Copy link
Member

dg replied May 10, 2012

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

This comment has been minimized.

Copy link
Contributor

fprochazka replied May 10, 2012

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

@dg: protože setTranslator()

@dg

This comment has been minimized.

Copy link
Member

dg replied May 10, 2012

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

This comment has been minimized.

Copy link
Contributor

juzna replied May 10, 2012

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

This comment has been minimized.

Copy link
Contributor

vojtech-dobes replied May 10, 2012

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

This comment has been minimized.

Copy link
Member

dg replied May 10, 2012

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

This comment has been minimized.

Copy link
Member

dg replied May 10, 2012

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

@dg

This comment has been minimized.

Copy link
Member

dg replied May 10, 2012

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

This comment has been minimized.

Copy link
Contributor

tomaswindsor replied May 18, 2012

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

Please sign in to comment.