У меня есть следующая функция:
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
.