Použití @inject v připadě abstraktní třidy
- Facedown
- Člen | 38
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
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)