pouzitie Enum a defaultnej hodnoty vyzaduje zaregistrovanie Enum ako sluzby
- Matúš Matula
- Člen | 257
Ak mam tento kod
<?php
enum MailDispatcherId: int
{
case DEFAULT = 1;
}
class MessageQueueMailer {
public function __construct(
private readonly MailDispatcherId $dispatcherId = MailDispatcherId::DEFAULT,
) {
}
}
?>
a v configu
nette.mailer:
# ak volam bez parametra, hodi chybu `Service 'mail.mailer' (type of MessageQueueMailer): Service of type Models\MessageQueue\MessageDispatchers\MailDispatcherId required by $dispatcherId in MessageQueueMailer::__construct() not found. Did you add it to configuration file? `
factory: MessageQueueMailer()
# funguje, ak volitelny parameter poskytnem
factory: MessageQueueMailer(Models\MessageQueue\MessageDispatchers\MailDispatcherId::DEFAULT)
je to bug? Ak ano, kde ho mam nahlasit? Tu https://github.com/nette/di/issues ?
- m.brecher
- Generous Backer | 871
@MatúšMatula
nejsem žádný specialista na DI, ale od pohledu mě přijde, že volitelný parametr v konstruktoru tak trochu popírá ideu dependency injection. MessageQueueMailer předpokládá předání závislosti ze service containeru do proměnné $dispatcherId, ale kdyby služba nebyla k dispozici, tak si závislost vytvoří sám jako MailDispatcherId::DEFAULT. Spíš by se to mělo navrhnout tak, že service container je schopen dodat závislost včetně hodnoty MailDispatcherId::DEFAULT. Smyslem DI je mít kód přehledný a transparentně předávané závislosti – tedy se raději defaultnímu parametru v konstruktoru vyhnout.
class MessageQueueMailer {
public function __construct(
private readonly MailDispatcherId $dispatcherId = MailDispatcherId::DEFAULT,
) {
}
}
- Marek Bartoš
- Nette Blogger | 1274
Implementováno v masteru, stable zatím není https://github.com/…i/issues/302
Proč by volitelné závislosti nemohly být? Pro testování time-sensitive kódu v knihovnách vyžaduju použití interface Clock, ale většina uživatelů to nikdy nebude potřebovat a nemá smysl je k tomu nutit.
Editoval Marek Bartoš (23. 12. 2023 20:02)
- Matúš Matula
- Člen | 257
@MarekBartoš super, vdaka za link
@mbrecher Tiez nie som ziadny specialista na DI, ale z toho co o nom viem, tak idea DI je o tom, aby sa zavislosti vstrekovali (z toho ten nazov) zvonka a to IMO nema nic spolocne ci je nejaky parameter povinny alebo volitelny. Kazdopadne vdaka za reakciu
- m.brecher
- Generous Backer | 871
@MatúšMatula
idea DI je o tom, aby sa zavislosti vstrekovali (z toho ten nazov) zvonka
No právě, závislosti by se měly předávat zvenku a když je závislost volitelná tak se předává zvenku jenom když se předá a když se nepředá tak si závislost (default value) vyrobí služba sama. Ale pokud Tvůj postup vede k přehlednějšímu kódu je to OK, di není žádné ortodoxní náboženství.