Injektnutie komponentu, nie tovarnicky do presenteru
- steelbull
- Člen | 241
Mám nasledujúcu komponentu a továrničku:
<?php
use Nette\Application\UI;
class ComponentTest extends UI\Control
{
private $text = 'aaaa';
public function nastavTest($text)
{
$this->text = $text;
}
public function odstranText()
{
$this->text = '';
}
}
interface IComponentTestFactory
{
/** @return ComponentTest */
public function create();
}
V presenteri mám:
/** @var \IComponentTestFactory @inject */
public $test;
Ako zabezpečím, aby som mal cez DI v $test nie IComponentTestFactory, ale rovno ComponentTest a mohol rovno zavolat $test->odstranText()?
Diq.
- newPOPE
- Člen | 648
Povedal by som, ze nejak takto:
public function __construct (ComponentTest $component) {...}
a konfiguracia
componentTestFactory: IComponentTestFactory
- class: ComponentTest
create: @componentTestFactory::create()
Je mozne, ze to ide aj bez registrovania tovarne samotnej (zapis si nepamatam), ja uprednostnujem dynamiku.
Editoval newPOPE (26. 2. 2018 8:13)
- David Matějka
- Moderator | 6445
proc to potrebujes? jaky je konkretni use case? protoze ti to muze rozbit ruzny veci
- steelbull
- Člen | 241
David Matějka napsal(a):
proc to potrebujes? jaky je konkretni use case? protoze ti to muze rozbit ruzny veci
Mám v aplikácii niekoľko helperov, ktoré som chcel zaregistrovať služby, aby som ich potom mohol injectovať pomocou DI do komponentov. Jedná sa o komponenty, ktoré sa nevykresľujú.
Napr. mám helper, ktorý mi umožňuje urobiť v presenteri
// Redirectne na Public presenter ak je uzivatel odhlaseny, alebo Projects ak
je prihlaseny
$this->redirects->redirectHome();
// Pamata si predchadzajucu URL, ktora nebola POST ani AJAX a redirectne spat
(napr. vo formulari, ked kliknem na Cancel button, redirectne na URL odkial som
prisiel na formular)
$this->redirects->redirectBack();
Momentalne vytvaram v base presenteri novu instanciu $this-redirects v metode startup();
atď.
Editoval steelbull (26. 2. 2018 11:18)
- David Matějka
- Moderator | 6445
jedine tak, ze si predas Application, ze ktere ziskas getPresenter. ale pozor, nevolej getPresenter v konsturktoru, ale application si uloz do property a presenter ziskes vzdy az ve chvili, kdy ho potrebujes. v ramci zivotniho cyklu aplikace totiz presenter nemusi existovat nebo se muze zmenit.
a druha poznamka, je lepsi se tomuhle zcela vyhnout, abys potreboval ve sluzbach presenter. co presne ma ta redirect service delat?