Къде да поставите допълнителни помощни функции за обект

Имам обект, като Game, с някои свойства като time, и има натоварване от Event обекта под него. Част от информацията за играта имплицитно се съхранява в обектите, напр. броя на смъртните случаи (посочен от броя на смъртните случаи).

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

Сещам се за няколко варианта, но не съм сигурен кое е „правилното“ нещо, което да направя.

  • Поставете функция getDeaths() в хранилище
    Имам впечатлението, че това е мястото, където трябва да отиде, но не знам как да осъществя правилен достъп до това от шаблона.
  • Поставете функция getDeaths() в обекта Game
    Най-лесното нещо, защото е лесно достъпно от шаблон.
  • Създайте функция в контролера
    Не изглежда гъвкаво да поискате тази информация от контролер

person Druckles    schedule 26.12.2014    source източник
comment
помощна папка в папката на пакета би било хубаво.   -  person teeyo    schedule 26.12.2014


Отговори (2)


Ако имплицитно съхранявате броя на смъртните случаи в обекта Game, тогава просто добавете функция getDeaths() към обекта. Вероятно така или иначе трябва да го имате там, вместо просто да запазите публична променлива, която така или иначе може да бъде модифицирана.

Методът Repository би бил необходим, ако трябваше да направите заявка за броя на смъртните случаи директно от базата данни, в който случай можете просто да го предадете директно към шаблона.

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

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

и след това във вашия шаблон:

{{ game.numDeaths }}

Можете също толкова лесно да предадете броя на смъртните случаи към вашия шаблон директно, така че да е лесно достъпен:

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

и след това във вашия шаблон:

{{ numDeaths }}

Надявам се това да помогне.

person Jason Roman    schedule 26.12.2014
comment
За да поясня, като казвам, че се съхранява „имплицитно“, имам предвид, че трябва да използвате Event обектите, съхранени в играта, за да изчислите броя на смъртните случаи (т.е. да получите отново достъп до базата данни), вместо да съхранявате променлива за броя на смъртните случаи. А други отговори показват, че предаването на хранилището към шаблона е лоша практика: 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
@A.L Не можах да намеря хранилища, споменати в примера, който сте свързали. За кой пример говориш? - 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

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

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
Докато създаването на персонализирана функция twig е осъществимо, изглежда ненужно за вашия конкретен пример - person Jason Roman; 27.12.2014
comment
@Druckles Къде трябва да бъде включен тогава? Разширението на Twig не е шаблон/изглед. Това е най-доброто място, където трябва да поставите вашата бизнес логика, която принадлежи на изгледа. - person xurshid29; 27.12.2014
comment
@Druckles Също така, не обичам да изобразявам действие на контролер в моите изгледи, това създава тясно свързване между тях.. - person xurshid29; 27.12.2014