Php 是否可以使用Symfony处理普通的旧HTML表单,但使用CSRF令牌?

Php 是否可以使用Symfony处理普通的旧HTML表单,但使用CSRF令牌?,php,forms,symfony,Php,Forms,Symfony,我正在为我的应用程序制作一个bootstrap4样式的支付表单,其中单选按钮选择支付方式。在尝试通过Symfony的表单类生成表单时,我发现它们限制性太强/太笨拙,无法满足我的需求。我不想乱搞Symfony表单主题(我觉得它太冗长了),我不想使用Symfony预先制作的引导主题,我也不想使用任何createFormBuilder任何东西 那么,有没有一种方法可以让我用Symfony的CSRF令牌制作一个简单的旧HTML表单?这似乎很有希望,但没有提到CSRF保护。根本不使用Symfony,而是生

我正在为我的应用程序制作一个bootstrap4样式的支付表单,其中单选按钮选择支付方式。在尝试通过Symfony的表单类生成表单时,我发现它们限制性太强/太笨拙,无法满足我的需求。我不想乱搞Symfony表单主题(我觉得它太冗长了),我不想使用Symfony预先制作的引导主题,我也不想使用任何
createFormBuilder
任何东西


那么,有没有一种方法可以让我用Symfony的CSRF令牌制作一个简单的旧HTML表单?这似乎很有希望,但没有提到CSRF保护。

根本不使用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>

{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>