Я задаю этот вопрос, чтобы понять.
В Symfony envirment 2.5 есть много сообщений на эту тему о переполнении стека. Некоторым людям нужен доступ к диспетчеру сущностей из сущности, чтобы создать метод «save ()» для примера.
Ясно, что ответы на это ОЧЕНЬ ПЛОХАЯ ПРАКТИКА делают, но мои потребности совсем другие.
У меня нет проблемы постоянства объектов, которая всегда делается из контроллеров.
У меня есть сенсорная сущность, которая выполняет очень сложный запрос для извлечения некоторых базовых данных, таких как серия данных или целые числа.
Я, например, датчик сущности. И я считаю особенно полезным уметь делать что-то вроде этого:
$temperature = $sensor->getTemperature();
или сделать веточку
{sensor.getTemperature()}
где getTemperature()
это очень сложный метод с очень сложным запросом MySQL DQL.
Когда я применяю новые методы обработки данных на объектах, они сразу становятся доступны для просмотра, без прикосновения к контроллеру, который просто вставляет программист внешнего интерфейса. $sensor->getNewMethod();
и сделано.
Я пытаюсь сделать мой код более изящным и лучше понять Symfony. Есть ли хороший способ сделать это, следуя правильной структуре?
если мне нужен такой метод в моих шаблонах — я обычно создаю функцию ветки для таких целей:
пример:
...
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);
Ваше исследование верно — вы не хотите делать это в сущности. Однако вы можете указать репозиторий Doctrine для своей сущности, а затем использовать его для своих расчетов. Поэтому всякий раз, когда вам нужно было рассчитать, вы должны сделать:
$em->getRepository('MyBundle:Sensor')
->getTemperature($sensor);
Вы также можете определить сервис и использовать этот запрос вместо этого.
Вы можете сделать вашу сущность сервисом и внедрить ее с помощью менеджера сущностей.
Но все же лучше оставить сущность для отображения (сеттеры, геттеры) и использовать репозиторий.