Для 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