Где разместить дополнительные вспомогательные функции для Entity

У меня есть сущность, такая как Game, с некоторыми свойствами, такими как time, и под ней находится множество Event сущностей. Некоторая информация об игре неявно хранится в сущностях, например. количество смертей (данное по количеству случаев смерти).

Если я хочу отображать количество смертей в шаблоне (у которого есть доступ к игровому объекту), где мне разместить логику?

Я могу придумать несколько вариантов, но я не уверен, какой из них "правильный".

  • Поместите функцию getDeaths() в репозиторий
    У меня сложилось впечатление, что она должна быть там, но я не знаю, как правильно получить к ней доступ из шаблона.
  • Поместите функцию getDeaths() в сущность Game
    Это проще всего сделать, потому что к ней легко получить доступ из шаблона.
  • Создайте функцию в контроллере
    Запрашивать эту информацию у контроллера не очень удобно.

person Druckles    schedule 26.12.2014    source источник
comment
папка helpers внутри папки пакета была бы хороша.   -  person teeyo    schedule 26.12.2014


Ответы (2)


Если вы неявно сохраняете количество смертей в сущности Game, просто добавьте к сущности функцию getDeaths(). Вы, вероятно, должны иметь его там в любом случае, а не просто хранить общедоступную переменную, которую можно изменить в любом случае.

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

Имейте в виду, что вы можете передать любое количество переменных в свой шаблон, так что это не обязательно должно быть просто

return array('game' => $game);

а затем в вашем шаблоне:

{{ game.numDeaths }}

Вы можете так же легко передать количество смертей напрямую в свой шаблон, чтобы он был легко доступен:

return array('game' => $game, 'numDeaths' => $numDeaths);

а затем в вашем шаблоне:

{{ numDeaths }}

Надеюсь, это поможет.

person Jason Roman    schedule 26.12.2014
comment
Чтобы уточнить, говоря, что он хранится «неявно», я имею в виду, что вам нужно использовать Event сущностей, хранящихся в игре, для определения количества смертей (т.е. снова получить доступ к базе данных), а не хранить переменную числа смертей. И другие ответы указывают на то, что передача репозитория в шаблон является плохой практикой: in-symfony2" title="как я могу получить доступ к функциям репозитория в шаблоне ветки в symfony2"> stackoverflow.com/questions/11754077/. - person Druckles; 26.12.2014
comment
Кроме того, если я хочу представить несколько статистических данных, не создаст ли это большую связь между шаблоном и контроллером? - person Druckles; 26.12.2014
comment
@Druckles документация Symfony2 показывает, как передать репозиторий в шаблон, поэтому я не думаю, что это плохая практика. - person A.L; 27.12.2014
comment
@AL Я не смог найти репозитории, упомянутые в приведенном вами примере. О каком примере вы говорите? - person Druckles; 27.12.2014
comment
@Jason Roman Если сущность Game содержит список сущностей (которые затем можно использовать для определения атрибута (например, смертей), считается ли это «запросом»? Т.е. можно ли просто поместить для этого вспомогательную функцию в Entity декларации, или следует использовать репозиторий? - person Druckles; 27.12.2014
comment
Если он содержит список сущностей, то он будет считаться запросом только в том случае, если этот список должен запрашивать базу данных, а вы еще не выполнили явную выборку с помощью соединения. В противном случае он не будет повторно запрашивать базу данных. Несмотря на это, я бы передал данные в ваш шаблон только после того, как они уже были рассчитаны, поскольку шаблон должен быть предназначен только для отображения данных, а не для выполнения вычислений. - person Jason Roman; 27.12.2014
comment
@Jason Roman В классическом примере категории/продукта Symfony2, где категория содержит список продуктов, не могли бы вы, например, добавить функцию getBoxes() в сущность Category, которая находит все содержащиеся в ней продукты, являющиеся коробками? - person Druckles; 27.12.2014
comment
Определенно нет, я бы сделал для этого функцию репозитория - person Jason Roman; 27.12.2014
comment
@Jason Roman Итак, функция репозитория, например. findBoxesForCategory($categoryid)? И вы бы передали функцию репозитория шаблону или создали расширение ветки, как указано выше? - person Druckles; 27.12.2014
comment
Я бы не стал создавать собственное расширение Twig. Я мог бы передать результаты функции репозитория в шаблон. По сути, к тому времени, когда я доберусь до шаблона, я не хочу делать никаких дополнительных вычислений. - person Jason Roman; 27.12.2014
comment
@JasonRoman Но если у вас есть несколько статистических данных для расчета и отображения, не создаст ли это сильную связь между контроллером и шаблоном? - person Druckles; 28.12.2014
comment
Если у вас есть несколько статистических данных для расчета, я бы создал для этого сервис. Затем ваш контроллер вызывает эти службы для получения данных, а затем вы передаете данные непосредственно в шаблон. Затем это будет следовать передовым методам контроллера освещения, многократно используемых функций в службе и использования Twig только для отображения данных, которые вы уже вычислили в коде. - person Jason Roman; 28.12.2014

Используйте пользовательское расширение/функции ветки:

public function getFunctions()
{
    return [
        new \Twig_SimpleFunction('number_of_death', [$this, 'getNumberOfDeath'])
    ]
}

public function getNumberOfDeath(Entity $entity)
{
    // logic

    return $return;
}

Применение:

{{ number_of_death(entity) }}
person xurshid29    schedule 26.12.2014
comment
У меня сложилось впечатление, что такую ​​логику не следует включать в шаблоны: stackoverflow.com/questions/11754077/. - person Druckles; 26.12.2014
comment
Хотя создание пользовательской функции ветки возможно, в вашем конкретном примере это кажется ненужным. - person Jason Roman; 27.12.2014
comment
@Druckles Куда его тогда следует включить? Расширение Twig не является шаблоном/представлением. Это лучшее место, где вы должны разместить свою бизнес-логику, которая принадлежит представлению. - person xurshid29; 27.12.2014
comment
@Druckles Кроме того, мне не нравится отображать действие контроллера в моих представлениях, это создает тесную связь между ними .. - person xurshid29; 27.12.2014