Php 是否可以使用Symfony处理普通的旧HTML表单,但使用CSRF令牌?
我正在为我的应用程序制作一个bootstrap4样式的支付表单,其中单选按钮选择支付方式。在尝试通过Symfony的表单类生成表单时,我发现它们限制性太强/太笨拙,无法满足我的需求。我不想乱搞Symfony表单主题(我觉得它太冗长了),我不想使用Symfony预先制作的引导主题,我也不想使用任何Php 是否可以使用Symfony处理普通的旧HTML表单,但使用CSRF令牌?,php,forms,symfony,Php,Forms,Symfony,我正在为我的应用程序制作一个bootstrap4样式的支付表单,其中单选按钮选择支付方式。在尝试通过Symfony的表单类生成表单时,我发现它们限制性太强/太笨拙,无法满足我的需求。我不想乱搞Symfony表单主题(我觉得它太冗长了),我不想使用Symfony预先制作的引导主题,我也不想使用任何createFormBuilder任何东西 那么,有没有一种方法可以让我用Symfony的CSRF令牌制作一个简单的旧HTML表单?这似乎很有希望,但没有提到CSRF保护。根本不使用Symfony,而是生
createFormBuilder
任何东西
那么,有没有一种方法可以让我用Symfony的CSRF令牌制作一个简单的旧HTML表单?这似乎很有希望,但没有提到CSRF保护。根本不使用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>
{form.customField.vars.choices%中的选项的%s}
{{option.label}
{%endfor%}
有了这个,我几乎不使用任何细枝模板,我仍然有一个CSRF令牌,Symfony几乎不处理表单(它只会检查CSRF令牌)根据此文档, 解决方案的一种尝试是使用类似(在symfony 3.4和4中):
- 在控制器中,您可以有如下功能:
- 现在,在您的模板中,您可以有如下内容(使用您自己的设计):
姓名:
我也不太喜欢Symfony表单。只需遵循以下文档:
/**
* @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>