chybějící type hint u třídy

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

Mám třídu, která v konstruktoru mám jeden parametr (string), který se jí předává při vytváření třídy a druhý parametr, který se předává přes DI. A hlásí mi to, že u toho prvního parametru chybí type hint, že je povinný. Jak a kam mám zapsat ten type hint, že se jedná o řetězec. Moje pokusy skončili tím, že mi to řeklo, že chybí service „string“, když jsem se snažil ten typ tam někam propašovat.

Mysteria
Člen | 797
+
0
-

Nikam, musíš ten řetězec uvést jako parametr. Ten druhý parametr se už dodá automaticky sám dle jeho typu.

hranicka
Člen | 23
+
0
-

Jestli máš ten constructor nějak takto:

public function __construct($string, \SomeObject $object)
{
	// ...
}

tak DI container neví co má dodat jako první parametr.

Musíš ho nadefinovat v configu při definování služby (config.neon) něco jako:

- My\Extra\Class('hodnota předaná do prvního parametry') # a další parametry už doplní DI container
Mirek
Člen | 86
+
0
-

Jenomže tam moje třída není předávaná přes DI. Objekt se vytváří v kódu:

$struktura = new GrpSeznam('STRUKTURA');
$groups = new GrpSeznam('Groups');

takže v configu jí vůbec nemám, tam mám jen tu třídu, která se předává jako druhý parametr

hranicka
Člen | 23
+
0
-

Tak v tom případě nevím kde je problém, když si vytváříš instanci přímo, tak musíš předat všechny závislosti přímo… Všechny povinné parametry…

Mirek
Člen | 86
+
0
-

tak jsem tedy při vytváření instancí GrpSeznam přidal ten druhý parametr napevno a už to nějak chodí

Pavel Macháň
Člen | 282
+
0
-

Pokud to registruješ do služeb tak musíš ten string parametr předat ručně (nette neví bez type hintu co tam vložit).

services:
	- MojeSluzba('mujString')

Když budeš mít první službu a až pak bez type hintu. Těma 3 tečkama řekneš ať to doplní autowire dle type hintu

services:
	- MojeSluzba(..., 'mujString')

Jestliže to nemáš ve službách tak tam musíš ručně předat VŠE

$struktura = new GrpSeznam('STRUKTURA', $this->nejakaInjectnutaSluzba);

Editoval EIFEL (2. 7. 2014 12:11)

Jan Endel
Člen | 1016
+
+1
-

Řešení? Továrnička!

class GrpSeznam
{
	private $name;

	/**
	 * MyApp\Dependency
	*/
	private $dependency;

	public function __construct($name, MyApp\Depedency $dependency)
	{
		$this->name = $name;
		$this->dependency = $dependency
	}
}



interface IGrpSeznamFactory
{
	/**
	 * @param string $name
	 * @return GrpSeznam
	 */
	public function create($name)
}

v config neonu:

	- {implement: IGrpSeznamFactory, parameters: [name]}

použití:

class MyPresenter extends Nette\Application\UI\Presenter
{
	/*
	 * @var IGprSeznamFactory
	 * @inject
	 */
	public $gprSeznamFactory;

	public function renderDefault()
	{
		$struktura = $this->gprSeznamFactory->create('STRUKTURA');
		$groups = $this->gprSeznamFactory->create('Groups');
	}
}

a nemusíš se zatěžovat řešením závislostí :-)

Mirek
Člen | 86
+
0
-

Díky za rady, nad továrničkou se ještě zamyslím, ale ono ta implementace je trochu složitější.