kedy pouzivat na komponentu inject, kedy vytvarat instanci a kedy pouzit instanci v tovarnicke?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
duskohu
Člen | 778
+
0
-

Vedely by ste mi niekto poradit? Mam v tom trosku bordel.

1. Kedy komponentu injectnut?

/** @var IMyControlFactory */
private $myFactory;

/**
 * INJECT MyControlFactory
 * @param IMyControlFactory $myFactory
 */
public function injectMyControlFactory(\IMyControlFactory $myFactory) {
    $this->myFactory = $myFactory;
}

protected function createComponentMy() {
    return $this->myFactory->create();
}

2. kedy vytvarat instanci

public function renderDefault() {
    $vp = new \VisualPaginator($this, 'vp');
}

3. kedy pouzit instanci v tovarnicke?

protected function createComponentMy() {
    return new \My();
}

Predpokladam, inject pouzivat ked:

1. chcem komponentu konfigurovat cez neon
lebo inak ma nic nenapada, kedze ostatne sa da predat cez autowiring, alebo cez seter, popripade priamo cez constructor.
Vedeli by ste mi to objesnit? Dakujem.

frosty22
Člen | 373
+
0
-

Mno lehce záludná otázka, jelikož v tomto směru v OOP není nikdy nic dané, ale tedy z praxe, mohu říci, že komponenty: createComponentXXX se používají v podstatě pro .. mno jak tohle vysvětlit .. primárně pro vizuální komponenty (není to pravidlem a též i nevizuální lze takto vytvořit) … ale komponenta takto vytvořená má jen jednu instanci, a vytváří se v případě první použití. Například nejčastěji jsou to formuláře, které se vytvoří buď při přijmutí signálu (po action, před render) pokud je onen formulář odeslaný .. pokud není vytvoří se až v šabloně, kdy je jeho první použití při vykreslení a nebo například při nastavení výchozích hodnot v action .. v praxi to jsou vykreslitelné komponenty – formulář, stránkování, ankety, atd.

Dále injektnutí komponenty, tak to jsem v praxi ještě nepoužil a tedy přesně si nevybavím použití, které jsi uvedl. Nemyslíš spíše injektnutí továrničky či accessora za cílem lazy-loadingu, což se používá u služeb, kterým potřebuješ předat objekt, který nechceš aby se ihned vytvořil, ale až při jeho použití. Například máš objekt, který má něco ukládat do databáze, ale nepotřebuješ, tam databázi pořád, ale pouze v případě, že má něco uložit, tak předáš accessor či továrničku, a neinjektneš službu přímo (https://phpfashion.com/…lazy-loading).

A onen případ vytvoření instance, tak právě zde máš v příkladu VisualPaginator, který by se měl vytvářet přes createComponentPaginator, který si definuješ například v BasePresenteru, a potom bys v render volal jen $this[„paginator“] nebo $this->getComponent(„paginator“) … a pokud to nezavoláš, tak se prostě nevytvoří .. a jinak tedy vytváření instance, by nemělo být „vůbec“ resp. opět tomu není tak, například entity se vytváří new XXX .. ale převážně vše můžeš mít bud jako službu abys měl veškeré závislosti v NEONu, a nebo jako továrničku se závislostmi též v NEONu … a to pak získáš službu v presenteru buď $presenter->context->XXX a nebo továrničku vytvoříš instanci $presenter->context->createXXX

vvoody
Člen | 910
+
0
-

1. a 3. sú správne, 1. je vhodné použiť ak si nechceš zasierať presenter závislosťami tvojej komponenty. 2. nechápem, čo by si ďalej s ‚$vp‘ robil?

Filip Procházka
Moderator | 4668
+
0
-

Já bych jen dodal, že 2. nikdy nedělej.

duskohu
Člen | 778
+
0
-

Pani dakujem za odpovede, tak aspon mam co prerabat lebo po moznosti injectovat v nette 2.1 dev som vsetky komponety prerobil na tento sposob, a mam pocit ze som sa trosku zainjctoval, a asi som to trosku prehnal :-P. Inak prikladam co by som robil s 2. VisualPaginator ala Dg https://componette.org/search/?…, predpokladam ze je to starsie, a odporucate createComponent urobit aj na toto.

vvoody
Člen | 910
+
0
-

duskohu: to je samozrejme nesprávny (nefunkčný/neúplný) príklad. Pozri si prvý koment na tej stránke :) už by sa to po tých rokoch zišlo aj opraviť :D