Вопрос по symfony, php – Где разместить вспомогательные функции модели в Symfony2

8

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

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;
}

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

Я не знаком с sympfony, поэтому не могу ответить на ваш вопрос, но могу сказать, что если у вас есть проблемы с производительностью в этом проекте, этот метод станет одним из узких мест. В вашем цикле for вы вычисляете длину массива на каждой итерации, что является довольно сложным процессом. Вы должны предварительно рассчитать его и использовать переменную в цикле. Кстати, в большинстве случаевforeach цикл немного быстрее, чемfor. Leri
@PLB. Хотя всегда хорошо предварительно вычислять длину массива, можно сказать, что это узкое место. В цикле нет запросов (или других типично медленных операций); и вы также не знаете размер массива. Это может быть массив из 10 или около того элементов, и в этом случае запуск не займет много времени, даже если он пересчитывает длину массива на каждой итерации. Paulpro
@ ascii-lime Когда вы находитесь в процессе создания проекта, который будет выпущен, вы должны создать максимально гибкий код. Вы не знаете, когда вам понадобится пересмотреть ваш код. И для производительности каждая мс имеет значение. Я не пойду на производительность на первых этапах разработки, если это "повредит" удобочитаемость кода, но в противном случае вы должны приложить все усилия, чтобы избежать потенциальных узких мест, подобных этому. Вскоре, когда вы сможете написать лучший код, напишите его, IMO. Leri

Ваш Ответ

2   ответа
13

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

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 Swett
Где в файловой системе я бы поместил код в ваше первое предложение? Jason Swett
Ну, настоящий ответ: где хочешь. Чтобы упростить процесс, я всегда держу каталог в своем каталоге под названием «Сервис» и помещаю туда все свои сервисы. Таким образом, класс будет выглядеть примерно так: \ SomeBundle \ Service \ ArrayUtils.
Благодарю. Что делает это более сложным, так это то, что мне нужно использоватьarray_duplicates() в сущности, и, очевидно, вы не можете получить услуги от сущностей. Так что я должен передатьArrayUtils экземпляр до объекта, который использует эту функцию? Если так, то это кажется хромым. Это, пожалуй, еще одна проблема. Jason Swett
Возможно, но это похоже на взлом. Этот массив не имеет ничего общего с сущностями. Jason Swett
3

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

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

Похожие вопросы