Správné vytváření komponent a jejich propojení s presenterem

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

Ahoj, pokud to tu někdo řešil tak mě kopněte na správné vlákno, já to nenašel. Tak jako klasicky zase jsem jednou narazil… Nepoužívám nette až tak moc, ale zajímalo by mě jak vlastně vypadá nejlepší způsob vytvoření a použití komponent.

Příklad:
Mám dvě komponenty:

namespace App\PrivateModule\Component;

class MyOwnedTask extends \Nette\Application\UI\Control
{
...

namespace App\PrivateModule\Component;

class MyResolvedTask extends \Nette\Application\UI\Control
{
...

Komponenty zaregistrováné jako services, ALE… pokud jim v configu nenastavím autowired: no tak si stěžují: „Multiple services of type Nette\ComponentModel\IContainer found: MyOwnedTask, MyResolwedTask

a pokud jim autowired: no nastavím tak dostanu za uši s „No service of type App\PrivateModule\Component\MyResolvedTask found.“ a nemohu tak použít v presenteru inject metodu. A musel bych komponentu presenteru předat třeba konstruktorem.

Trochu jsem si myslel (asi jsem najivní), že pokud v inject metodě prostě chci \App\PrivateModule\Component\MyOwnedTask tak ho nebudou zajímat předci… zdá se, že zatím v těchto automagických věcech nemám uplně jasno…

Nette: 2.2.0

Díky

Editoval besir (30. 12. 2014 15:46)

David Matějka
Moderator | 6445
+
+2
-

Muze za to tento konstruktor v CM\Component. V masteru je to jiz vyreseny.
Nyni to vyresis tak, ze ve vsech komponentach prekryjes konstruktor, i pokud nevyzadujes zadnou zavislost:

public function __construct()
{
	parent::__construct();
}

btw, nemas ty komponenty primo registrovane jako sluzby, ze ne??

Editoval matej21 (30. 12. 2014 16:03)

besir
Člen | 170
+
0
-

@matej21 btw mam :D Nemam je tedy v configu registrovat vubec?

David Matějka
Moderator | 6445
+
0
-

mas je registrovat, ale pomoci tovarnicek

Zax
Člen | 370
+
+2
-

Do configu patří služby, což obvykle (ne vždy) znamená jednu jedinou instanci nějaké konkrétní třídy (či interfacu). Pokud něco ve službě změníš, obvykle se to projeví v celé aplikaci, jenže komponenty chceme často použít víckrát (ať už napříč projektem, nebo jen v jenom presenteru pomocí Multiplieru) a chceme je mít na sobě nezávislé, proto je dobrým zvykem si pro každou komponentu vytvořit službu – továrnu – která nám dokáže takovou nezávislou komponentu vyrobit zavoláním metody create(). Viz odkaz nade mnou ;-)