我的应用程序使用symfony框架。为了保存数据库中的记录,我想调用$ this-> getDoctrine() - > getManager();我的实体类中的方法。但是当我这样做时它给了我错误: 调用未定义的方法getDoctrine(),
有人可以告诉我这是怎样的正确方法。
我的实体类就像:
命名空间Acme \ SuperbAppBundle \ Entity;
使用Symfony \ Component \ DependencyInjection \ Container; 使用Doctrine \ ORM \ Mapping作为ORM;
class Users
{
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $firstName;
/**
* @var string
*/
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set firstName
*
* @param string $firstName
* @return Users
*/
public function setFirstName($firstName)
{
$this->firstName = $firstName;
return $this;
}
/**
* Get firstName
*
* @return string
*/
public function getFirstName()
{
return $this->firstName;
}
function __construct($firstName){
$this->setFirstName($firstName);
}
function save(){
$em = $this->getDoctrine()->getManager();
$em->persist($create);
$em->flush();
}
}
我的控制器方法如下:
public function test(){
$create = new Users('Rajat');
$create->save();
}
答案 0 :(得分:5)
您的保存方法正在尝试调用
$this->getDoctrine();
其中$this
是当前的Class,以及它继承的任何其他Class。就目前而言,您当前的Class,User是独立的,并且没有getDoctrine()
方法。如果您的类要扩展Controller类,它可以访问该方法:
class User extends Controller
我相信这个简单的修复工作会起作用,虽然它可能没有真正意义上扩展Controller,因为它是一个用户实体,与Controller无关。一种首选的,更高级的方法是将Doctrine服务注入User类。
答案 1 :(得分:2)
好的,首先是Doctrine实体: 处理实体生成和配置 在setter和getter上声明操作。 如果您将对象保存到您的实体中,那么它是您的用户,您有两种方式来存储此用户: 一: 您可以使用实体管理器来存储用户,实体将帮助您使用seters和getter创建正确的对象:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use PATH\TO\Users;
class ExampleController extends Controller
{
public function examplefunction()
{
$em = $this->getDoctrine()->getManager();
$entity = new Users();
$entity->setFirstName('Rajat');
$em->persist($entity);
$em->flush();
}
}
另一种方法是使用QueryBuilder创建此条目,但在您的情况下这是一个糟糕的方法。 哦,我忘记了请删除实体中的保存方法Doctrine manager已经实现了它。
答案 2 :(得分:0)
您的控制器可能不会延伸Symfony\Bundle\FrameworkBundle\Controller\Controller
...
你应该像这个例子那样定义控制器:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
}
答案 3 :(得分:0)
实体类不扩展ContainerAware / Controller,因此您无法调用$ this-> getDoctrine() - > getManager()。我不认为您的Entity类应该扩展到Controller。因为您的实体类将成为控制器实例,因为您想要访问该主题管理器。那是一个不好的做法。你可以做的是通过服务将doctrine manager注入你的Entity类。
几周前我写了一篇关于注入服务容器和通过构造函数访问的博客。您可以像注入服务容器一样注入doctrine实体管理器。如果您愿意,可以查看: - http://anjanasilva.com/blog/injecting-services-in-symfony-2/这是一个关于注入教义管理者的好问题。请务必阅读答案。 : - Symfony 2 EntityManager injection in service
关于注入自定义存储库管理器而不是注入整个实体管理器的另一个很好的教程。我认为这是一个很好的解决方案。 : - http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/
希望这有助于增加您对Symfony 2的理解。
干杯!