Инъекция менеджера сущностей Symfony в сущности

Я задаю этот вопрос, чтобы понять.

В Symfony envirment 2.5 есть много сообщений на эту тему о переполнении стека. Некоторым людям нужен доступ к диспетчеру сущностей из сущности, чтобы создать метод «save ()» для примера.

Ясно, что ответы на это ОЧЕНЬ ПЛОХАЯ ПРАКТИКА делают, но мои потребности совсем другие.

У меня нет проблемы постоянства объектов, которая всегда делается из контроллеров.

У меня есть сенсорная сущность, которая выполняет очень сложный запрос для извлечения некоторых базовых данных, таких как серия данных или целые числа.

Я, например, датчик сущности. И я считаю особенно полезным уметь делать что-то вроде этого:

$temperature = $sensor->getTemperature();

или сделать веточку

{sensor.getTemperature()}

где getTemperature() это очень сложный метод с очень сложным запросом MySQL DQL.

Когда я применяю новые методы обработки данных на объектах, они сразу становятся доступны для просмотра, без прикосновения к контроллеру, который просто вставляет программист внешнего интерфейса. $sensor->getNewMethod(); и сделано.

Я пытаюсь сделать мой код более изящным и лучше понять Symfony. Есть ли хороший способ сделать это, следуя правильной структуре?

1

Решение

если мне нужен такой метод в моих шаблонах — я обычно создаю функцию ветки для таких целей:

пример:

...

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);
2

Другие решения

Ваше исследование верно — вы не хотите делать это в сущности. Однако вы можете указать репозиторий Doctrine для своей сущности, а затем использовать его для своих расчетов. Поэтому всякий раз, когда вам нужно было рассчитать, вы должны сделать:

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

Вы также можете определить сервис и использовать этот запрос вместо этого.

1

Вы можете сделать вашу сущность сервисом и внедрить ее с помощью менеджера сущностей.
Но все же лучше оставить сущность для отображения (сеттеры, геттеры) и использовать репозиторий.

0
По вопросам рекламы [email protected]