Php 在FOSUserBundle上的一个模板中使用Symfony3登录和注册表单

Php 在FOSUserBundle上的一个模板中使用Symfony3登录和注册表单,php,symfony,fosuserbundle,symfony-3.2,Php,Symfony,Fosuserbundle,Symfony 3.2,我需要把登录表和注册表放在同一页。我正在使用Symfony 3.2和FOS用户包 我发现: 这是我的第一个方法,但有一个问题。验证错误时,页面被重定向到另一个路由(仅显示提交表单的模板)。问题是SecurityController和RegistrationController不知道在Twig中呈现两个FOS控制器的控制器,它们只显示表单模板。使用这种方法,我不能覆盖fos控制器显示的模板来显示主模板,因为这样会产生无限递归 我试图覆盖fos控制器,对表单的验证错误执行重定向,但重定向会使验证消息

我需要把登录表和注册表放在同一页。我正在使用Symfony 3.2和FOS用户包

我发现:

这是我的第一个方法,但有一个问题。验证错误时,页面被重定向到另一个路由(仅显示提交表单的模板)。问题是SecurityController和RegistrationController不知道在Twig中呈现两个FOS控制器的控制器,它们只显示表单模板。使用这种方法,我不能覆盖fos控制器显示的模板来显示主模板,因为这样会产生无限递归

我试图覆盖fos控制器,对表单的验证错误执行重定向,但重定向会使验证消息丢失

我还尝试将请求转发给fos SecurityController和RegistrationController(如下所示),但对于登录的检查操作,我得到:

RuntimeException“您必须在安全防火墙配置中使用form_login配置防火墙要处理的检查路径。”

它已经配置好并且正在工作,但是直接将请求转发给控制器似乎会破坏它(我不知道登录检查是如何进行的,因为check方法只返回一个运行时异常)

我能想到的最后一个解决方案是在新控制器中创建两个表单,但我不知道如何手动调用fos用户登录检查(对于注册,我可以从RegistrationController复制所有registerAction)


谢谢你的时间。

好的,我终于可以让它工作了。我制作了一个新的控制器,它使用fos控制器的输出呈现登录表单和注册表单。登录表单操作路径为登录检查,注册表单操作路径与控制器的路径相同(前端登录值)

控制器:

/**
 * @Route("/ingresar", name="frontend_login")
 * @Method({"GET", "POST"}) 
 */
public function loginAndRegisterAction(Request $request){

    $login_response = $this->forward('FOSUserBundle:Security:login', array( $request ));
    $register_response = $this->forward('FOSUserBundle:Registration:register', array( $request ));

    return $this->render('frontend/usuario/login_register.html.twig', array(
        'login' => $login_response->getContent(),
        'register' => $register_response->getContent(),
        ));
}
在显示内容的模板中,将其显示为原始(控制器返回已在其内容中呈现为html的表单)

我必须覆盖FosUserBundle模板,但不要扩展FosUserBundle布局。参考资料/FOSUserBundle/layout.html.twig:

{% block fos_user_content %}{% endblock fos_user_content %}
配置security.yml以指示登录路径是我们定义的控制器路径之一。出现错误时,它将显示前端登录路径

最后,重写显示表单的模板,以便注册表的操作路径为前端登录。我这样做是因为我需要更改html结构,我认为将fos_user_registration_registration路由更改为我们定义的路由应该可以做到这一点

{{ form_start(form, {'method': 'post', 'action': path('frontend_login'), 'attr': {'class': 'fos_user_registration_register', 'novalidate': 'novalidate'}}) }}
    {{ form_widget(form) }}
    <div>
        <input type="submit" value="Submit" />
    </div>
{{ form_end(form) }}
{form_start(form,{'method':'post','action':path('frontend_login'),'attr':{'class':'fos_user_registration_register','novalidate':'novalidate'}}}
{{form_widget(form)}
{{form_end(form)}}
frontend:
        pattern: ^/
        context: website
        form_login:
            provider: fos_userbundle
            login_path: frontend_login
            check_path: login_check
{{ form_start(form, {'method': 'post', 'action': path('frontend_login'), 'attr': {'class': 'fos_user_registration_register', 'novalidate': 'novalidate'}}) }}
    {{ form_widget(form) }}
    <div>
        <input type="submit" value="Submit" />
    </div>
{{ form_end(form) }}