Symfony实体管理器在实体中注入

时间:2014-12-23 15:53:55

标签: php mysql entity-framework symfony doctrine-orm

我要问这个问题。

在Symfony环境2.5中,关于堆栈溢出有很多关于此主题的帖子。有些人需要从实体访问实体管理器,以便为exaple创建一个方法“save()”。

很清楚,答案是非常糟糕的做法,但我的需求却大相径庭。

我没有对象持久性的问题,总是来自控制器。

我有一个传感器实体执行一些非常复杂的查询来检索一些基本数据,如一系列数据或整数。

我要开发一个实体传感器。而且我发现特别有用的能够做到这样的事情:

$temperature = $sensor->getTemperature(); 

或在树枝上做

{sensor.getTemperature()}

其中getTemperature()是一个非常复杂的方法,具有非常复杂的MySQL DQL查询。

当我在实体上强制使用新的数据gatering方法时,它们立即可用于视图,只需触摸控制器,前端程序员只需插入$sensor->getNewMethod();即可完成。

我正在努力让我的代码更加精致,并且更好地理解Symfony。有没有什么好方法可以按照正确的结构来做呢?

3 个答案:

答案 0 :(得分:2)

如果我在模板中需要这样的方法 - 我通常会为此目的创建一个twig函数:

示例:

...

public function getFunctions()
{
    return [
        new \Twig_SimpleFunction('get_category_hierarchy', [$this, 'getCategoryHierarchy']),
        ...
    ];
}

....

public function getCategoryHierarchy(CategoryTerm $categoryTerm = null)
{
    // some heavy logic here

    return $categoryHierarchy;
}

用法(在模板中):

get_category_hierarchy(category_term)

如果我需要在模板之外更好地创建服务:

public function getSomeHeavyData(Entity $entity)
{
    // some heavy logic here

    return $data;
}

用法(控制器中的for.ex):

$myService = $this->get('my_service');
$data = $myService->getSomeHeavyData($entity);

答案 1 :(得分:1)

您的研究是正确的 - 您不想在实体中执行此操作。您可以做的是为您的实体指定一个Doctrine存储库,然后将其用于您的计算。因此,无论何时您需要计算,您都可以:

$em->getRepository('MyBundle:Sensor')
    ->getTemperature($sensor);

您也可以定义服务,然后使用该服务调用您的查询。

答案 2 :(得分:0)

您可以将您的实体作为服务并将其注入实体管理器。 但更好的是留下实体用于映射(setter,getters)和使用存储库。