Я пытаюсь изменить подход рендеринга шаблонов. Я использовал серверный механизм шаблонов. Теперь, когда мне нужно возвращать только JSON из бэкэнд вместо HTML, мне нужно перенести свой шаблон на front-end.
Проблема для меня как новичка, когда шаблон содержит форму. Другими словами, когда конечный JSON также должен содержать токен csrf. Пожалуйста, возьмите пример приложения CRUD для книг (одна сущность Book(id_book, name)
). Шаблон для Read
записи показывает имя книги и позволяет удалить книгу.
В контроллере Symfony2 я использую createFormBuilder()
который создает объект формы удаления, к которому применяется createView()
. Объект, возвращаемый последним, используется form_widget()
в движке шаблона (Twig). В конце:
<div id="bookName">{{book.name}}</div> <div id="bookDelete"> <form action="{{ path('book_delete', { 'id': book.id }) }}" method="post"> <input type="hidden" name="_method" value="DELETE" /> {{ form_widget(delete_form) }} <button type="submit"></button> </form> </div>
Который вернется:
<div id="bookName">Symfony2 In Depth</div> <div id="bookDelete"> <form action="/web/app_dev.php/deletes" method="post"> <input type="hidden" name="_method" value="DELETE"> <div id="form"> <input type="hidden" id="form_id" name="form[id]" value="15"> <input type="hidden" id="form__token" name="form[_token]" value="dd6573ae916ae30f78ba35a8c67e5d42a2764c1c"> </div> <button type="submit"></button> </form>
То, что я представляю себе при перемещении шаблона в front-end, является окончательным JSON с сервера, похожим на:
{ 'id':15, 'name': 'Symfony2 in Depth', 'csrf_token' : 'dd6573ae916ae30f78ba35a8c67e5d42a2764c1c' }
Вопрос в том, как реализовать один и тот же внутренний механизм Symfony2 для рендеринга токена csrf для формы DELETE, как часть окончательного JSON для чтения объекта книги? Допустимо ли избавляться от {{ form_widget(delete_form) }}
и всех его длинных объектов и только сериализовать токен csrf с именем книги? На что это повлияет? Я чувствую, что это хорошо для производительности, но как?
Ваше обычное руководство очень ценится.
Вы можете создать твиг-файл примерно так:
{ 'id': '{{ form.id.vars.value }}' 'name': '{{ form.name.vars.value }}' 'csrf_token': '{{ form._token.vars.value }}' }
В любом случае, я не рекомендую использовать токен csrf при использовании API, лучше отключить его. Если вы хотите отключить для всех приложений в config.yml:
framework: csrf_protection: enabled: false
Или просто для одной формы в форме типа add:
public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'csrf_protection' => false, )); }