použití form factory v komponentě

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

Ahoj,

Mám komponentu, která je využita na více místech aplikace, ve kterých je společně s ní potřeba vykreslit různé formuláře. Ty jsou v několika form factories, a pokud bych je chtěl předávat jako závislosti konstruktorem, vzniklo by mi těch závislostí mnoho. Je chyba, když si nechám danou form factory injectovat do presenteru (pomocí autowire) a odkazovat na ni z komponenty?
Jinými slovy, zda je toto špatný návrh:

<?php

class Presenter
{

	/**
	 * @var FormFactory
	 * @inject
	 */
	public $formFactory;

	/**
	 * @var ControlFactory
	 * @inject
	 */
	public $controlFactory;


	public function createComponentControl()
	{
		return $this->controlFactory->create();
	}

}


class Control
{

	// zde se zbavím přímé závislosti na form factories
	public function __construct(...)
	{
	}

	public function createComponentForm()
	{
		return $this->presenter->formFactory->createForm();
	}

}
?>

Případně jak takovou situaci řešit?

Díky!

Editoval Magnus (13. 5. 2016 12:06)

David Matějka
Moderator | 6445
+
+1
-

Ano, je to spatny navrh. Vyuzivas presenter jako nejaky service locator pro komponentu, ve ktere skryvas zavislost.

Pokud chces dostavat do (base)komponent vice zavislosti a nechces si zasirat konstruktor, pouzij inject metody/anotace v komponente a zkombinuj s decorator extension (bud ze pomoci toho zapnes u basecontrol inject, nebo rucne vyjmenujes inject metody, ktere se maji autowirovat). Ukazku decorator extension najdes v testech https://github.com/…n.basic.phpt