Předání parametrů do komponenty při použití Interface

před 5 lety

Ripper
Člen | 56
+
0
-

Dobrý večer všem,

našel jsem skvělou věc – https://pla.nette.org/…h-autowiring – začal jsem to používat, ale teď jsem dorazil k tomu, že nevím jak mám do komponenty předat z presenteru nějaký parametr, pokud používám tento způsob „volání“ komponenty.

Nejlépe abych mohl parametr před někde tady –

/**
 * @return FlashMessageControl
 */
protected function createComponentFlashMessage()
{
    return $this->flashMessageControl->create();
}

před 5 lety

vitkutny
Člen | 73
+
0
-
/**
 * @return FlashMessageControl
 */
protected function createComponentFlashMessage()
{
    return $this->flashMessageControl->create($mojePromenna);
}
interface FlashMessageContolFactory{
/**
* @return ...
*/
    public function create($mojePromenna);
}
services:
    -
        implement: FlashMessageControlFactory
        parameters: [mojePromenna]
        arguments: [%mojePromenna%]

a samozřejmě upravit konstruktor Control třídy, aby jako první parametr příjmala tuto proměnnou, snad jsem na nic nezapoměl

před 5 lety

Vojtěch Dobeš
Člen | 1317
+
0
-

Pokud se ten argument konstruktoru bude jmenovat taky $mojePromenna (aby to odpovídalo zápisu v NEON konfiguraci), tak dokonce nemusí být první, může být i poslední, myslím.

před 5 lety

Jiří Nápravník
Člen | 708
+
0
-

vojtech.dobes: opravdu to tak jde? Ja se prave snazil dostat tyhle parametry na konec, protoze chci mit jako prvni ty „autowiringove“ a na konci tyhle, a nepodarilo se mi to jinak nez, pouzit v parametrs (nebo arguments?) …, …, mojePromenna

před 5 lety

Ripper
Člen | 56
+
0
-

Děkuji za odpovědi, bohužel, nedaří se mi tam ten parametr dostat, napíšu zdroj co mám –

Presenter –

    /** @var IFlashMessagesControlFactory @inject */
public $flashMessageControl;


/**
* Render Default
*/
public function renderDefault()
{
    $this->flashMessage('Testovací zpráva funguje!');
    $this->flashMessage('Testovací zpráva s parametrem "info" funguje!', 'info');
}


/**
 * @return FlashMessagesControl
 */
protected function createComponentFlashMessage()
{
    return $this->flashMessageControl->create('asd');
}

Interface –

interface IFlashMessagesControlFactory
{

    /**
     * @internal param null $templateFile
     *
     * @param $templateFile
     *
     * @return FlashMessagesControl
     */
    public function create($templateFile);

}

A komponenta –

   /**
 * @param \Kdyby\Translation\Translator $translator
 * @param null $templateFile
 */
public function __construct(Translator $translator, $templateFile = NULL)
{
    parent::__construct();

    $this->translator = $translator;

    if (!$templateFile) {
        $templateFile = __DIR__ . '/FlashMessagesControl.latte';
    }

    $this->templateFile = $templateFile;
}

Neon –

services:
    flashmessages:
        implement: IFlashMessagesControlFactory
        parameters: [templateFile]

Nefunguje ani když odstraním z contructoru Translator.

před 5 lety

vitkutny
Člen | 73
+
0
-

ten parametr v constructoru dej na začátek nebo použij 3 tečky za každý autowirovaný parametr jak píše @Jiří Nápravník a v configu ti chybí

arguments: [%templateFile%]

před 5 lety

Ripper
Člen | 56
+
0
-

Pro jistotu jsem z contrustoru odstranil parametr pro Translator, ale bez úspěchu. Laděnka křičí – Service ‚flashmessages‘: Expected class, method or property, NULL given.

před 5 lety

Ripper
Člen | 56
+
0
-

Tak jsem to nakonec vyřešil takto –

services:
    flashmessages:
        implement: IFlashMessagesControlFactory
        create: FlashMessagesControl(%templateFile%)
        parameters: [templateFile]

před 5 lety

vitkutny
Člen | 73
+
0
-

teď jsem si vzpoměl že to co jsem psal, jde pouze v masteru díky komitu před 16 dny https://github.com/…te/pull/1398

pokud použiješ novější verzi nette nemusíš uvádět duplicitně (už je v továrničce) název vytvářené komponenty