Где помещать вспомогательные функции модели в Symfony2

У меня есть следующая функция:

function array_duplicates($array) { $duplicates = array(); $unique = array_unique($array); for ($i = 0; $i < count($array); $i++) { if (!array_key_exists($i, $unique)) { $duplicates[] = $array[$i]; } } return $duplicates; } 

Эта функция, очевидно, не применима к какой-либо определенной модели, и это не помощник шаблона. Где будет подходящее место для выполнения этой функции? (Пожалуйста, не говорите «где угодно».)

Это может быть тот тип вещей, который вы использовали бы в сервисе. Создайте класс следующим образом:

 class ArrayUtils { function array_duplicates($array) { ... return $duplicates; } } 

А затем определите его как услугу. Если вы используете YAML, вы добавили бы что-то подобное в ваш файл config.yml:

 services: arrayUtils: class: Full\Path\To\ArrayUtils 

В этой конфигурации Symfony создаст один экземпляр вашего массива ArrayUtils и предоставит всем вашим контроллерам доступ к нему. Затем вы можете вызвать его так:

 class SomeController { public function someAction() { ... $duplicates = $this->get("arrayUtils")->array_duplicates($array); ... } } 

Все это входит в рамки внедрения инъекций Symfony. Это довольно круто, и я рекомендую прочитать здесь: http://symfony.com/doc/2.0/book/service_container.html

Альтернативный вариант

Теперь это может быть немного излишним для такого небольшого фрагмента кода. Если вы собираетесь использовать это только в одном комплекте, тогда вы можете просто поместить его в базовый контроллер, и все остальные контроллеры расширят этот базовый контроллер.

 class BaseController { function array_duplicates($array) { ... } } class SomeController extends BaseController { function someAction() { $this->array_duplicates($array); } } 

По соглашению классы полезности идут под пространством имен Util .

Если вы используете пакеты, класс перейдет в пространство имен YourBundle\Util . Если вы этого не сделаете , он войдет в пространство имен Acme\Util – папку src/Acme/Util .