Где разместить вспомогательные функции модели в 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;
}

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

 Jason Swett04 окт. 2012 г., 20:35
 Leri04 окт. 2012 г., 19:46
Я не знаком с sympfony, поэтому не могу ответить на ваш вопрос, но могу сказать, что если у вас есть проблемы с производительностью в этом проекте, этот метод станет одним из узких мест. В вашем цикле for вы вычисляете длину массива на каждой итерации, что является довольно сложным процессом. Вы должны предварительно рассчитать его и использовать переменную в цикле. Кстати, в большинстве случаевforeach цикл немного быстрее, чемfor.
 Paulpro04 окт. 2012 г., 19:57
@PLB. Хотя всегда хорошо предварительно вычислять длину массива, можно сказать, что это узкое место. В цикле нет запросов (или других типично медленных операций); и вы также не знаете размер массива. Это может быть массив из 10 или около того элементов, и в этом случае запуск не займет много времени, даже если он пересчитывает длину массива на каждой итерации.
 Leri04 окт. 2012 г., 20:23
@ ascii-lime Когда вы находитесь в процессе создания проекта, который будет выпущен, вы должны создать максимально гибкий код. Вы не знаете, когда вам понадобится пересмотреть ваш код. И для производительности каждая мс имеет значение. Я не пойду на производительность на первых этапах разработки, если это "повредит" удобочитаемость кода, но в противном случае вы должны приложить все усилия, чтобы избежать потенциальных узких мест, подобных этому. Вскоре, когда вы сможете написать лучший код, напишите его, IMO.

Ответы на вопрос(2)

Решение Вопроса

что вы положили в службу. Создайте такой класс:

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

Alternative Option

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

class BaseController
{
    function array_duplicates($array)
    {
        ...
    }
}

class SomeController extends BaseController
{
    function someAction()
    {
        $this->array_duplicates($array);
    }
}
 Jason Swett04 окт. 2012 г., 21:26
Возможно, но это похоже на взлом. Этот массив не имеет ничего общего с сущностями.
 Jason Swett04 окт. 2012 г., 20:32
Где в файловой системе я бы поместил код в ваше первое предложение?
 Jason Swett04 окт. 2012 г., 20:33
Или, говоря иначе, где бы в каталогах проекта я поместил бы этот код?
 04 окт. 2012 г., 20:43
Ну, настоящий ответ: где хочешь. Чтобы упростить процесс, я всегда держу каталог в своем каталоге под названием «Сервис» и помещаю туда все свои сервисы. Таким образом, класс будет выглядеть примерно так: \ SomeBundle \ Service \ ArrayUtils.
 Jason Swett04 окт. 2012 г., 20:55
Благодарю. Что делает это более сложным, так это то, что мне нужно использоватьarray_duplicates() в сущности, и, очевидно, вы не можете получить услуги от сущностей. Так что я должен передатьArrayUtils экземпляр до объекта, который использует эту функцию? Если так, то это кажется хромым. Это, пожалуй, еще одна проблема.

Util Пространство имен.

Если вы используете связки, класс перейдет вYourBundle\Util Пространство имен. если тыдон & APOS; т, это пошло бы вAcme\Util пространство имен & # x2014;src/Acme/Util папка.

Ваш ответ на вопрос