Použití @inject v připadě abstraktní třidy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Facedown
Člen | 38
+
0
-

Ahoj, začnu hned kódem:

services.neon

services:
	- Admin\Model\Storage\AddStorage
	- Front\Model\Storage\AddStorage
	- App\BaseModule\Forms\IArgumentForm
namespace App\AdminModule\Presenters;
class AddPresenter extends BasePresenter {
	/** @var \Admin\Model\Storage\AddStorage @inject */
	public $storage;
	/** @var \App\BaseModule\Forms\IArgumentForm @inject */
	public $argumentForm;
}
namespace App\FrontModule\Presenters;
class AddPresenter extends BasePresenter {
	/** @var \App\BaseModule\Forms\IArgumentForm @inject */
	public $argumentForm;
	/** @var \Front\Model\Storage\AddStorage @inject */
	public $storage;
}
namespace Base\Model\Storage;
abstract class AbstraktniTrida {
	public function __construct(\Nette\Database\Context $db, \Nette\Security\User $u) {
		$this->database = $db;
		$this->user = $u;
	}
namespace Front\Model\Storage;
class AddStorage extends \Base\Model\Storage\AbstraktniTrida {
}
namespace Admin\Model\Storage;
class AddStorage extends \Base\Model\Storage\AbstraktniTrida {
}
namespace App\BaseModule\Forms;
class ArgumentForm extends Control {
	public function __construct(\Base\Model\Storage\AbstraktniTrida $storage) {
		$this->storage = $storage;
	}

Problém je v tom, že mi Tracy říká toto: „Service ‚35_App_BaseModule_Forms_IArgumentForm‘: Multiple services of type Base\Model\Storage\AbstraktniTrida found: 26_Admin_Model_Storage_AddStorage, 48_Front_Model_Storage_AddStorage“.

Chci využít toho, že do ArgumentForm můžu dát jakoukoliv třídu, která dědí od abstraktní třídy a to se asi Tracy nelíbí. Pro mě nejideálnější způsob by byl, že bych něco změnil v services, aby nedocházelo k duplikaci services, ale nevím jak.

Moje otázka tedy je, jak bych měl tuto hirearchii tříd či services.neon změnit, aby nedocházelo k této chybě? Děkuji za odpověď.

enumag
Člen | 2118
+
+1
-

Problém je v tom, že máš dvě služby typu \Base\Model\Storage\AbstraktniTrida a DI kontejner neví kterou z nich chceš předat do ArgumentForm. Můžeš například v services.neon specifikovat kterou z nich předat:

services:
    - Admin\Model\Storage\AddStorage
    - Front\Model\Storage\AddStorage
    -
		implement: App\BaseModule\Forms\IArgumentForm
		arguments: [ @Front\Model\Storage\AddStorage ]

Doufám že jsem nepopletl syntaxi, nepoužívám tenhle způsob moc často.

Editoval enumag (30. 5. 2015 17:52)

Facedown
Člen | 38
+
0
-

Super, super, jde to. Jen jsem místo „implements“ musel dát „implement“, ale jinak dobrý. Děkuju ti za radu.

enumag
Člen | 2118
+
0
-

:-) Opraveno.