Поддерживает ли Symfony 2 частичное связывание формы?

Мои вопросы:

  1. Поддерживает ли Symfony 2 PATCH запросы или любой тип частичной отправки содержимого формы? Если да, то существует ли «правильный» (или, точнее, «предпочтительный») способ сделать это?

  2. Существуют ли какие-либо другие шаблоны или способы решения этой проблемы, помимо PRE_BIND (см. Ниже) событийного подхода? Если есть другие способы решения этой проблемы, считается ли один из них лучше или хуже других?

Что я нашел / сделал на данный момент: Согласно запросу на вытягивание на Github (# 5576), была проделана работа по поддержке частичного связывания форм в Symfony 2 (насколько я понимаю, для Symfony 2.2). Однако я не могу найти никакой документации или примеров за пределами этого запроса на перенос, которые показывают, как использовать частичные привязки форм.

Одно решение, которое я нашел, может соответствовать моим целям. Подход состоит в том, чтобы прикрепить подписчика события к событию PRE_BIND для типа формы, беглый поиск stackoverflow дал следующий ответ, аналогичный тому, который я использую сейчас: https://stackoverflow.com/a/11687863/657674.


person Sean Quinn    schedule 05.11.2013    source источник


Ответы (1)


Для PATCH запросов Symfony 2.3 (может быть, более ранняя?) Изначально поддерживает частичные обновления модели. См. Объяснение ниже.

Для запросов, отличных от PATCH (например, PUT и POST), вы все равно можете выполнить частичную привязку данных, создав и зарегистрировав подписчика событий, чтобы преобразовать неотправленные данные в их исходные значения, или вы можете написать собственный обработчик запросов, чтобы всегда вызывать $form->submit() метод с $clearMissing, установленным в false.

Обработка частичного связывания с PATCH запросами

Покопавшись немного во внутреннем устройстве Symfony и лучше разобравшись в подписчиках на события и расширениях форм, я наткнулся на класс HttpFoundationRequestHandler. По сути, начиная с Symfony 2.3, вместо вызова $form->submit($request) при связывании отправленных данных формы разработчики должны вызывать $form->handleRequest($request); это вызывает прикрепленный обработчик запросов (по умолчанию HttpFoundationRequestHandler). Обработчик запросов делает несколько вещей, но самое главное - это то, как он вызывает $form->submit(). Он передает значение false в submit метод формы, если метод запроса был PATCH, сообщая форме не связывать неподтвержденные данные формы как null значения.

Есть некоторые предостережения относительно использования метода PATCH в Symfony 2.3, которые могут быть дополнительно объяснены в документации Symfony:

Как использовать HTTP-методы помимо GET и POST в маршрутах:

«К сожалению, жизнь не так проста, поскольку большинство браузеров не поддерживают отправку запросов PUT и DELETE. К счастью, Symfony2 предоставляет вам простой способ обойти это ограничение. Включив параметр _method в строку запроса или параметры HTTP-запроса, Symfony2 будет использовать их как метод при сопоставлении маршрутов. "

Приведенная выше цитата из документации Symfony объясняет, что большинство браузеров не поддерживают отправку запросов PUT, PATCH или DELETE. Это проблема, потому что для того, чтобы использовать встроенную поддержку Symfony для частичного обновления форм, нам нужно использовать PATCH запрос. Однако Symfony дает ответ на этот вопрос. Документация говорит нам, что мы можем использовать параметр _method или значение формы, чтобы подделать фактический запрос, который мы хотим, и Symfony будет точно знать, что мы имеем в виду. Однако для понимания _method вам, возможно, придется включить параметр конфигурации http_method_override, например:

# config.yml
framework:
    http_method_override: true
    ...

Есть также другие способы сообщить Symfony, какой метод должна использовать форма, и их можно найти здесь: Изменение действия и метода формы.

person Sean Quinn    schedule 08.11.2013