Мои вопросы):
Поддерживает ли Symfony 2 запросы PATCH
или какие-либо заявки на предоставление частичной формы контента? Если да, существует ли «правильный» (или, что более точно «предпочтительный») способ сделать это?
Помимо PRE_BIND
(см. Ниже), существуют ли какие-либо другие шаблоны или способы решения этой проблемы? Если есть другие способы решения этой проблемы, считаются ли какие-либо из них лучшими или хуже, чем другие?
То, что я нашел / сделал до сих пор: согласно запросу на Github ( № 5576 ), работа была выполнена для поддержки привязки частичной формы в Symfony 2 (по моему мнению, с таргетингом на Symfony 2.2). Однако я не могу найти документацию или примеры за пределами этого запроса на растяжение, которые указывают, как использовать привязки частичной формы.
Одно решение, которое я нашел, может удовлетворить моим целям. Подход состоит в том, чтобы присоединить абонента события к событию PRE_BIND
для типа формы, беглый поиск stackoverflow дал следующий ответ, который похож на тот, который я сейчас использую: https://stackoverflow.com/a/11687863/657674 ,
Для запросов 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
чтобы _method
нам запрос, и Symfony точно знает, что мы имеем в виду. _method
не менее, для _method
чтобы понять _method
, вам может потребоваться включить http_method_override
конфигурации http_method_override
, например:
# config.yml framework: http_method_override: true ...
Существуют также другие способы сказать Symfony, какой метод должен использовать форма, и их можно найти здесь: Изменение действия и метода формы .