Symfony3 FossUserBundle从另一个控制器呈现注册表单,以便通过ajax注册

时间:2017-04-11 19:57:33

标签: php symfony symfony-forms

在我的Symfony 3项目中,我使用FossUserBundle,我想要实现的是将我为注册页面开发的扩展表单呈现给另一个控制器 WITHOUT 重定向。

换句话说,我想要实现的是通过Ajax和/register调用/路由来呈现表单。因此,我想要执行第一步并尝试在/而不是/register中呈现表单,但所有后期操作都将在/register

中完成

因此我尝试了以下内容:

我已将Appbundle类更改为:

namespace AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AppBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

并尝试了AppBundle\Controller\Pages课程:

1.在不延伸FOS\UserBundle\Controller\RegistrationController;

的情况下渲染表单
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;


/**
 * @author pcmagas
 * Class that loads miscellanous pages
 */
class PagesController extends Controller
{
    /**
     *@Route("/", name="index")
     *@Method("GET")
     */
    function homePage()
    {
        $form = $this->get('fos_user.registration.form');

        return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.twig', array(
                     'form' => $form->createView(),
             ));
    }
}

2.扩展FOS\UserBundle\Controller\RegistrationController并尝试呈现表单:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use FOS\UserBundle\Controller\RegistrationController as BaseController;

/**
 * @author pcmagas
 * Class that loads miscellanous pages
 */
class PagesController extends BaseController
{
    /**
     *@Route("/", name="index")
     *@Method("GET")
     */
    function homePage()
    {
        $form = $this->get('fos_user.registration.form');

        return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.twig', array(
                     'form' => $form->createView(),
             ));
    }
}

这两种方法都无法呈现表单(只需渲染它,记住/register路由将在通过ajax提交时处理表单。)并返回以下错误消息:

  

您已请求不存在的服务“fos_user.registration.form”。你的意思是其中一个:“fos_user.registration.form.factory”,“fos_user.registration.form.type”?

你有什么想法怎么做?

编辑1

我试过了:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use FOS\UserBundle\Controller\RegistrationController as BaseController;

/**
 * @author pcmagas
 * Class that loads miscellanous pages
 */
class PagesController extends BaseController
{
    /**
     *@Route("/", name="index")
     *@Method("GET")
     */
    function homePage()
    {
        $form = $this->get('fos_user.registration.form.type');

        return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.twig', array(
                     'form' => $form->createView(),
             ));
    }
}

有错误:

  

尝试调用类“FOS \ UserBundle \ Form \ Type \ RegistrationFormType”的名为“createView”的未定义方法。

同样的结果:

  

尝试调用类“FOS \ UserBundle \ Form \ Factory \ FormFactory”的名为“createView”的未定义方法。

1 个答案:

答案 0 :(得分:1)

最后这对我有用:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

/**
 * @author pcmagas
 * Class that loads miscellanous pages
 */
class PagesController extends Controller
{
    /**
     *@Route("/", name="index")
     *@Method("GET")
     */
    function homePage()
    {
        $form = $this->get('fos_user.registration.form.factory');
        $form = $form->createForm();

        return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.twig', array(
                     'form' => $form->createView(),
             ));
    }
}