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

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

Dobrý večer všem,

našel jsem skvělou věc – https://doc.nette.org/…tion/factory – 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();
}
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

Vojtěch Dobeš
Gold Partner | 1316
+
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.

Jiří Nápravník
Člen | 710
+
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

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.

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%]
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.

Ripper
Člen | 56
+
0
-

Tak jsem to nakonec vyřešil takto –

services:
	flashmessages:
		implement: IFlashMessagesControlFactory
		create: FlashMessagesControl(%templateFile%)
		parameters: [templateFile]
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