在实体对象中注入或访问服务容器

时间:2014-09-11 08:52:21

标签: symfony doctrine-orm

我想访问以下实体的服务容器,但是如何?

检查了这一点但是当我在读听众时我迷路了;

控制器

public function indexAction()
{
   $orders = $this->getDoctrine()->getManager()->getRepository('MyAdminBundle:Orders')->findAll();
   .....
}

实体

namespace My\AdminBundle\Entity;

class Orders
{
   private $container;

   public function __constructor()
   {
      $this->container = ??????
   }

   public function getCurrency()
   {
      return $this->container->getParameter('currency');
   }
}

2 个答案:

答案 0 :(得分:6)

@Ahmend是正确的,因为你不应该将容器注入实体。在您的情况下,您可能会执行以下操作:

// Controller
$order = ...find($orderId);
$currency = $this->getContainer()->getParameter('currency');
$price = $order->calculatePrice($currency);

因此货币作为方法参数传递。

我完全理解这是一个困难的概念,特别是如果一个用于活动记录和大量的全局变量。但最终它会有意义并产生更好的代码。

然而,只是让你不被卡住,我会告诉你从任何地方访问容器的秘密。事实证明,app内核是一个全局变量。所以:

class Orders
{
    public function getCurrency()
    {
        global $kernel;
        $container = $kernel->getContainer();
        return $container->getParameter('currency');
    }

答案 1 :(得分:1)

正如the link you sharedAn entity is a data model and should only hold data (and not have any dependencies on services)中所述。然后你应该找到另一种干净的方式去做你想做的事。

根据您的代码,可以假设您的配置中定义了currency的值(除非您以container的其他方式注入它)。 不相关肯定会将其严格限制在您的某个实体中。