Továrna na komponentu, interface nebo ne

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

Ahoj,

chci se zeptat jaký je rozdíl mezi těmito způsoby:

  1. s interfacem

soubor MyControl.php

class MyControl extends UI\Control
{
	private $myVariable;
	private $translator;

	public function __construct($myVariabel, ITranslator $translator, ...){
		parent::__construct();
		$this->myVariable = $myVariable;
		$this->translator = $translator;
	}

	public function someFce(){
	...
	}
}

soubor IMyControlFactory.php

interface IMyControlFactory
{
    /** @return Component\MyControl */
    function create($myVariable);
}

a nyní si přidám interface do configu a v presenteru zavolam pres $control->create($myVariable);

  1. bez interfacu

soubor MyControlFactory.php

class MyControl extends UI\Control
{
	private $myVariable;
	private $translator;

	public function __construct(ITranslator $translator, ...){
		parent::__construct();
		$this->translator = $translator;
	}

	public function create($myVariable){
		$this->myVariable = $myVariable;
		...

		return $this;
	}

	public function someFce(){
	...
	}
}

do configu si zaregistruju přímo tuhle factory a v presenteru zavolám uplně stejně $control->create($myVariable);

Jaký je v tom tedy rozdíl ?

David Matějka
Moderator | 6445
+
0
-

Ty neregistrujes tovarnu, ale primo komponentu. A to volani create() volas uz na komponente a bude to vracet porad stejnou instanci.

Registrovani komponenty jako sluzby tu uz bylo mnohokrat rozebirano, tak jen ve zkratce: bude to zpusobovat problemy, pokud napriklad budes chtit komponentu pouzit vicekrat, muze to zpusobovat problemy pri internich forwardech (napr na error presenter)

Ten interface je jen zjednoduseni, nette dle toho vygeneruje klasickou tovarnu, viz treba http://zlml.cz/…nitive-guide

kleinpetr
Člen | 480
+
0
-

Aha, tak už jsem to pochopil. Ten interface vytváří novou instanci celé té komponenty. Zmátlo mě totiž v čistém sandboxu je signInForm, který je rovnou jako factory a má metodu create() ovšem mi nedošlo, že právě v této metodě vytváří novou instanci UI\Form, kterou poté vrací, takže se to vlastně jako továrna počítá.

Editoval kleinpetr (19. 11. 2015 15:37)