Definice služeb a tři tečky
- Šaman
- Člen | 2654
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)
- Šaman
- Člen | 2654
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 | 505
Šaman napsal(a):
Je o tom někde nějaký článek, nebo odstavec v dokumentaci, pls?
- janpecha
- Backer | 75
@Š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.