DI na základě anotace, bez konstruktoru/inject metody

miho
Člen | 13
+
0
-

Zdravím. Mám v common.neon

mail:
	smtp: true
	host: ...
...
services:
	- App\Mailer(@Nette\Mail\Mailer)

a Mailer.php

namespace App;

use Nette\Utils\Strings;
use Nette\Mail\Message;
use Latte\Engine;

class Mailer
{

	/** @var \Nette\Mail\Mailer @inject */
	private $mailer;

	public function __construct(\Nette\Mail\Mailer $mailer) {
		$this->mailer = $mailer;
	}

...

to funguje ok. Jak to mám upravit aby se to injektovalo samo na základě anotace, tedy bez konstruktoru? Když odeberu konstruktor a z configu vyhodím to (@Nette\Mail\Mailer), tak $mailer==null, neinjectne se to. Zkoušel jsem i php8 anotaci.

Předem díky za nakopnutí správným směrem.

Felix
Nette Core | 1199
+
0
-

Ahoj, je to temer dobre. Musis povolit inject anotace.

https://doc.nette.org/…dependencies#…

services:
	mailer:
		create: App\Mailer
		inject: true
Gappa
Nette Blogger | 208
+
+1
-

Ještě změnit private $mailer na public $mailer.

miho
Člen | 13
+
0
-

Díky, funguje. Proč to BTW není defaultně zapnuté?

Felix
Nette Core | 1199
+
+4
-

Protoze predavani zavislosti pres konstruktor je doporucena varianta. Potom pres setter a az posledni pres @inject.

Šaman
Člen | 2661
+
+1
-

Je to porušení zapouzdření. Je to objekt, který nikde neříká, co potřebuje a dokonce si to nechává zvenku zapsat do public property (kam můžeš v PHP7 zapsat prakticky cokoliv, nic nehlídá, že tam bude opravdu Nette Mailer).