pouzitie Enum a defaultnej hodnoty vyzaduje zaregistrovanie Enum ako sluzby

Matúš Matula
Člen | 257
+
0
-

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 | 761
+
0
-

@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 | 1176
+
+1
-

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
+
0
-

@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 | 761
+
0
-

@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í.