Injektnutie komponentu, nie tovarnicky do presenteru

steelbull
Člen | 241
+
0
-

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

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

proc to potrebujes? jaky je konkretni use case? protoze ti to muze rozbit ruzny veci

steelbull
Člen | 241
+
0
-

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

tak ale to nejsou pak komponenty, ale normalni sluzby, ne?

steelbull
Člen | 241
+
0
-

Jj, pravda. Dal som zly priklad na zaciatku. Upravil som jeden helper na sluzbu, ale:

services:
    RedirectService: \Services\RedirectService(/*da sa tu vlozit instancia presenteru?*/)
David Matějka
Moderator | 6445
+
+1
-

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?