Поддерживает ли 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 ,

Для запросов 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, какой метод должен использовать форма, и их можно найти здесь: Изменение действия и метода формы .