Контроллер как сервис - Как передавать и возвращать значения в расширенном случае?

1

Используя Symfony, я показываю таблицу с некоторыми элементами, которые пользователь может выбрать. Существует немного больше сложностей, поскольку это может включать в себя вызов некоторых дополнительных действий, например, для фильтрации записей в таблице, сортировки по различным критериям и т.д.

Я реализовал все это в собственном комплекте, скажем, ChoiceTableBundleChoiceTableController). Теперь я хотел бы иметь возможность использовать этот пакет из других пакетов, иногда с некоторой дополнительной параметризацией.

Мой желаемый рабочий процесс будет выглядеть следующим образом:

  1. Пользователь в настоящее время работает с Bundle OtherBundle и запускает chooseAction.
  2. chooseAction направляется в ChoiceTableController (соответственно его действие по умолчанию).
  3. В ChoiceTableBundle пользователь может перемещаться, фильтровать, сортировать,... используя действия и маршрутизацию, поставляемые этим пакетом.
  4. Когда пользователь сделал свой выбор, он запускает другое действие (например, choiceFinishedAction), и поток управления возвращается в OtherBundle, передавая результаты выбора пользователей.
  5. Исходя из этих результатов, OtherBundle может продолжить работу.

Кроме того, OtherOtherBundle (и еще несколько...) также должны иметь возможность использовать этот рабочий процесс, возможно, передавая некоторые значения конфигурации ChoiceTableBundle чтобы заставить его вести себя немного иначе.

Я читал о шаблоне "Контроллер как услуга" Symfony 2 и ИМХО, это правильный подход здесь (если нет, скажите, пожалуйста;)). Поэтому я бы сделал сервис из ChoiceTableController и использовал его из других пакетов. Во всяком случае, имея в виду рабочий процесс, я не вижу "хорошего" способа достижения этого:

  • Как передать параметры конфигурации ChoiceTableBundle (соответственно ChoiceTableController), если необходимо?
  • Как узнать ChoiceTableBundle, откуда он был вызван?
  • Как я могу вернуть результаты в этот вызывающий пакет?

Основными подходами могут быть сохранение значений в сеансе или создание промежуточного объекта. Оба мне не кажутся особенно изящными. Не могли бы вы дать мне толчок в правильном направлении? Спасибо заранее!

  • 0
    Этот вопрос кажется мне довольно сложным. Если вы не получите других ответов, не могли бы вы предоставить более простую версию с конкретным кодом и ожидаемым результатом?
Теги:
controller

1 ответ

1
Лучший ответ

Главный вопрос: действительно ли вам нужно называть свою логику фильтрации/поиска в качестве действия контроллера. Вам действительно нужно сделать запрос?

Я бы сказал, что это также можно сделать, просто передав все необходимые данные службе, которую вы определяете.

Эта услуга, которую вы должны создать из кишки вашего ChoiceTableBundle и пусть вы используете ChoiceTableBundle и ваш OtherBundle для использования извлеченной службы.

сервис/библиотека

// register it in your service container
class FilteredDataProvider
{
    /** 
    * @return customObjectInterface or scallar or whatever you like
    */
    public function doFiltering($searchString, $order)
    {
        return $this->filterAndReturnData($searchString, $order)
    }
 }

      ...

class OtherBundleController extends Controller {
     public function showStuffAction() {
         $result = $this->container->get('filter_data_provider')
              ->doFiltering('text', 'ascending')

     }
}

способ управления

Все это может быть выполнено с использованием того же подхода, что и lipp/imagine bundle.

Имейте контроллер как услугу и позвоните/отправьте всю необходимую информацию этому контроллеру, когда вам нужны какие-то результаты, вы также можете отправить весь запрос.

class MyController extends Controller
{
    public function indexAction()
    {
        // RedirectResponse object
        $responeFromYourSearchFilterAction = $this->container
            ->get('my_search_filter_controller')
            ->filterSearchAction(
                $this->request, // http request
                'parameter1' // like search string
                'parameterX' // like sorting direction
            );   
        // do something with the response
        // ..
    }
}

Отдельный класс обслуживания будет намного более гибким. Также, если вам нужны другие параметры или объект Request, вы всегда можете его предоставить.

Информация о том, как объявить контроллер как услугу: http://symfony.com/doc/current/cookbook/controller/service.html

Как использует липид: https://github.com/liip/LiipImagineBundle#using-the-controller-as-a-service

  • 0
    Прежде всего, извините за опоздание, чтобы среагировать! Спасибо, что показали мне два варианта, оба кажутся мне очень полезными, и я согласен, что первый вариант может быть еще более гибким. Таким образом, я постараюсь пойти по этому пути.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню