我正在为我的应用程序制作Bootstrap 4样式的付款表格,其中单选按钮选择付款方式。在尝试通过Symfony的表单类制作表单时,我发现它们过于严格/笨拙,无法执行我想要的操作。我不想弄乱Symfony的表单主题(我觉得它很冗长),我不想使用Symfony的预制Bootstrap主题,也不想使用任何createFormBuilder
。
因此,我可以使用Symfony的CSRF令牌制作普通的旧HTML表单吗? answer似乎很有希望,但没有提及CSRF保护。
答案 0 :(得分:1)
根据本文档How to Implement CSRF Protection, 解决方案的尝试是使用类似的东西(在symfony 3.4和4中):
/**
* @Route("/names", methods={"POST"}, name="app_post_names")
*/
public function postName(Request $request)
{
$name = $request->request->get('name');
$csrfToken = $request->request->get('_csrf_token');
if(!$this->isCsrfTokenValid('token_id', $csrfToken)) {
// ... throw bad request
}
// ... Do other thing
}
<form action="{{ path('app_post_names') }}" method="post">
Name : <input name="name" type="text" />
<input name="_csrf_token" value="{{ csrf_token('token_id') }}" type="hidden" />
<input type="submit" value="send" />
</form>
答案 1 :(得分:0)
根本不使用Symfony,而是生成自己的令牌吗?
制作表格时,您确实不需要使用Symfony表格主题。
我自己总是建立自己的表单标签。
您要自定义选择吗?也可以做
您想使用不在实体中的字段,也可以这样做...
Symfony形式的约束并不像您想象的那样严格。
您很可能对此事没有“知道如何”的认识。
控制器
public function customFormAction(Request $request) {
$form=$this->createFormBuilder()
->setAction($this->generateUrl('route_name'))
->setMethod('POST')
->add("customField", ChoiceType::class, array(
'choices'=>array(
'1'=>'Choice 1',
'2'=>'Choice 2',
'3'=>'Choice 2',
),
'required'=>true,
'mapped'=>false, //Isn't mapped to any entity
))
->getForm();
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$customField=$form->get('customField')->getData();
//do your stuff
}
return $this->render('route_name', array(
'form'=>$form->createView(),
));
}
树枝视图
<form action="{{ form.vars.action }}" method="{{ form.vars.method }}">
<div class="input-field">
<select id="{{ form.customField.vars.id }}" name="{{ form.customField.vars.full_name }}" class="my_classes">
{% for option in form.customField.vars.choices %}
<option data-attr="my_attributes" value="{{ option.value }}">{{ option.label }}</option>
{% endfor %}
</select>
</div>
<input name="{{ form._token.vars.full_name }}" value="{{ form._token.vars.value }}" type="hidden">
</form>
有了这个,我几乎没有使用任何树枝模板,我仍然拥有CSRF令牌,而Symfony几乎不处理表格(它只会检查CSRF令牌)