Definice služeb a tři tečky

Šaman
Člen | 2573
+
0
-

Ahoj, potřebuji předat do service v configu závislost – jinou službu, která nemá zaplý autowiring (mám více translátorů). Pamatoval jsem si, že lze použít tři tečky pro běžné závislosti. Ale nemohu k tomu dohledat dokumentaci, ani best practise. V kontruktoru mám onu službu jako první parametr a zkoušel jsem více zápisů, které kupodivu fungují:

services:
	- App\PersonService(@exportTranslator, ..., ...) # konstruktor má tři parametry
	- App\PersonService(@exportTranslator, ...)
	- App\PersonService(@exportTranslator) # <- i tak se předaji i ostatní parametry konstruktoru?

A pokud není naše služba jako první parametr, ale několikátý, je nutné uvést tolik trojteček, kolik je předchozích parametrů, nebo to lze i jinak?

services:
	- App\PersonService(..., ..., @exportTranslator) # funguje, ale mírně nepraktické

Editoval Šaman (18. 9. 2020 11:35)

ali
Člen | 341
+
+2
-

Tri tecky vidim prvne, ale melo by to byt takto

- App\PersonService(nazevParametru: @exportTranslator)
Šaman
Člen | 2573
+
0
-

Název parametru? Eh, něco mi brutálně uteklo? :o
A hele, ono to funguje – what is this sorcery?

class PersonService
{
	public function __construct(
		Configuration $configuration,
		Translator $exportTranslator,
		PersonRepository $personRepository
	)
	{
		# ...
	}
}
services:
	- App\PersonService(exportTranslator: @exportTranslator)

Díky, tohle řeší hodně. Je o tom někde nějaký článek, nebo odstavec v dokumentaci, pls?

nightfish
Člen | 216
+
0
-

Šaman napsal(a):
Je o tom někde nějaký článek, nebo odstavec v dokumentaci, pls?

https://doc.nette.org/…/di-services#…

Šaman
Člen | 2573
+
+4
-

Díky. Jsem slepejš, tuhle sekci jsem měl teď otevřenou několikrát, ale hledal jsem tam tu starou tečkovou syntaxi.
Tak jen mohu potvrdit, že to funguje i v jednom řádku, tak jak to mám výše. Tohle o dost zpřehlední configy, pokud to kromě mě ještě někdo neznal :)

janpecha
Backer | 75
+
+2
-

@Šaman jen pro objasnění – ty tři tečky fungují jako hint „programátor parametr vynechal“, proto ty 3 různé zápisy fungují stejně, protože tam nastane následující konverze:

App\PersonService(@exportTranslator, ..., ...) => [0: @exportTranslator]
App\PersonService(@exportTranslator, ...) => [0: @exportTranslator]
App\PersonService(@exportTranslator) => [0: @exportTranslator]

App\PersonService(@exportTranslator, ..., @serviceA) => [0: @exportTranslator, 2: @serviceA]
App\PersonService(..., ..., @serviceA) => [2: @serviceA]

To číslo představuje pozici parametru v konstruktoru. A místo čísla lze použít i název parametru jak zmínil @ali.