![](/img/trans.png)
[英]How to inject container/service to Doctrine2 entity in Symfony2?
[英]How can I inject doctrine into Symfony2 service
我使用簡化的控制器,沒有服務容器。 我正在嘗試將學說注入服務中。 這是錯誤:
ContextErrorException: Catchable Fatal Error: Argument 1 passed to Acme\Controller\WebController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /home/hcs/Core/app/cache/dev/appDevDebugProjectContainer.php on line 3036 and defined in /home/hcs/Core/src/Acme/Controller/WebController.php line 28
這是我的服務def:
doctrine:
dbal:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
orm:
mappings:
Acme:
type: annotation
dir: %kernel.root_dir%/../src/Acme/Model
prefix: Acme\Model
alias: Model
is_bundle: false
services:
WebController:
class: Acme\Controller\WebController
arguments: [@doctrine.orm.entity_manager ]
parent: elnur.controller.abstract
和我的班級
use Doctrine\ORM\EntityManager;
/**
* @Service("WebController", parent="elnur.controller.abstract")
*/
class WebController extends AbstractController
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
這是SF2容器的輸出(php app / console container:debug | grep -i enity)
doctrine.orm.default_entity_manager container EntityManager5330e85ad5afb_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrine\ORM\EntityManager
doctrine.orm.entity_manager n/a alias for doctrine.orm.default_entity_manager
doctrine.orm.validator.unique container Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator
form.type.entity container Symfony\Bridge\Doctrine\Form\Type\EntityType
translator container Symfony\Component\Translation\IdentityTranslator
我也在服務定義中嘗試了參數:[“@ doctrine.orm.entity_manager”]但仍然沒有。 我已經嘗試過清理我的緩存,但我不能為我的生活注入EM。 我究竟做錯了什么?
問題是你要為同一個類混合YAML服務定義和DiExtra注釋。 YAML定義已滿並提供了所需的依賴關系,但您尚未添加@InjectParams
來使用@Service
批注。 基本上,您使用不同的方法創建單個類的兩個服務,並且注釋方法不完整。
從類中刪除@Service
注釋,或者,如果您更喜歡注釋(我這樣做),也可以使用注釋注入依賴項並刪除YAML服務定義:
/**
* @InjectParams({
* "em" = @Inject("doctrine.orm.entity_manager")
* })
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
}
@InjectParams
注釋將諸如$em
類的參數名稱與服務名稱(如@em
相匹配。 由於沒有@em
服務,您必須覆蓋與@Inject
批注的默認匹配。
但有一種方法可以簡化它。 您可以在YAML配置文件中將實體管理器別名為@em
:
services:
em:
alias: doctrine.orm.entity_manager
現在您可以簡化@InjectParams
注釋:
/**
* @InjectParams
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.