我有这样的服务链接到我的实体中的一个方法:
entity_form:
class: AppBundle\Entity\EntityForm
calls:
- [setDoctrine, ['@doctrine']]
该参数将(或至少应该) doctrine 注入我的实体,以便我可以从方法中的db中获取内容。
我为getter设置了它,因为我不得不在__construct
中省略设置参数,因为在代码中,类永远不会"构造"
实体本身如下:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="entity_form")
*/
class EntityForm
{
protected $id;
protected $url;
protected $name;
protected $className;
protected $description;
private $doctrine;
public function getId()
{
return $this->id;
}
/* _All Getters An Setters Here.._ */
private function setDoctrine($doctrine)
{
return $doctrine;
}
public function createEntity($id)
{
$this->setDoctrine();
$entityPath = sprintf('AppBundle:%s:%s', __NAMESPACE__, $this->getClassName());
var_dump($this->doctrine);
exit;
//var_dump is temponary and only for testing the doctrine
$entity = $this->doctrine->getRepository($entityPath)->find($id);
return $entity;
}
}
此实体存储有关网站表单的信息。有了这个,我想很好地快速创建表格的实体,从给定的Id。
运行此类代码会出现此错误:
警告:缺少参数1 调用的AppBundle \ Entity \ EntityForm :: setDoctrine() 第139行的C:\ PHP \ Repos \ centaur \ src \ AppBundle \ Entity \ EntityForm.php 和定义
发生此错误的原因是什么?我该如何解决?
任何帮助都会很棒
答案 0 :(得分:-1)
论证将(或至少应该)学说注入我的实体中 我可以从db里面的方法中获取东西。
没有
您使用setter-injection entity_form
服务定义了AppBundle\Entity\EntityForm
服务,其价格仅为doctrine
。
因此,带有注入服务的EntityForm
在容器中可用,它不会被注入到每个创建的EntityForm
中。
看起来你应该阅读更多有关责任的内容。您希望在createEntity
方法中实现的内容应该是应用程序服务层的一部分,而不是模型本身。
模型不了解应用程序/基础结构概念,因此注入ORM不行。
关于提到的错误,仅考虑服务定义和该调用:
$this->setDoctrine();
你想在没有必要参数的情况下调用setter,可能错过了你的服务定义已经进行了setter-injection。
正如我之前提到的,实体基本上不是服务,所以将该部分移动到特定的类中,并使用标准DI注入与数据库相关的服务。