FOS覆盖注册控制器

时间:2014-04-29 20:35:28

标签: php symfony fosuserbundle

我试图了解并使用FOSUserbundle。

我有一个简单的逻辑添加到注册过程,将用户链接到客户。 为此,我创建了一个子包(远远地设置了FOS)。

然后我为控制器提供了以下代码:

class RegistrationController extends BaseController
    {
        public function RegisterAdminUserAction(Request $request)
        {
            $em = $this->getDoctrine()->getManager();
            $customer = new Customer();
            $customer = $em->getRepository('MyRepo:Customer')->findOneById(1);



        /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
        $formFactory = $this->container->get('fos_user.registration.form.factory');
        /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
        $userManager = $this->container->get('fos_user.user_manager');
        /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
        $dispatcher = $this->container->get('event_dispatcher');

        $user = $userManager->createUser();
        $user->setEnabled(true);

        $event = new GetResponseUserEvent($user, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

        if (null !== $event->getResponse())
        {
            return $event->getResponse();
        }

        $form = $formFactory->createForm();
        $form->setData($user);


        if ('POST' === $request->getMethod()) 
         {
            $form->bind($request);

            //form received
            if ($form->isValid()) 
            {
                $event = new FormEvent($form, $request);
                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

                $user->setType("CustomerAdmin");
                $user->setCustomer($customer);
                $userManager->updateUser($user);


                if (null === $response = $event->getResponse()) 
                {
                    $url = $this->container->get('router')->generate('fos_user_registration_confirmed');
                    $response = new RedirectResponse($url);
                }

                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

                return $response;
            }
        }
        else
        {    
            return $this->container->get('templating')->renderResponse('NRtworksSubscriptionBundle:RegisterAdmin:registration.html.'.$this->getEngine(), array(
        'RegisterAdminForm' => $form->createView(),
    ));

        }
    }
}

这只是我从原始控制器粘贴的代码。

我有两个问题:

  • 我对getDoctrine()的调用不起作用,显然是因为控制器没有扩展主类Controller。我的问题是如何在扩展FOS的控制器中访问实体管理器和所有主题函数?

  • 你可以看到控制器的最后一部分:  $这个 - >容器 - >获得('模板') - >的renderResponse(' NRtworksSubscriptionBundle:。RegisterAdmin:registration.html' $这个 - > getEngine() ,阵列(         ' RegisterAdminForm' => $形式 - > CreateView的(),     )); 与原来不同。我不得不自己放一个,否则表格会将我重定向到原来的FOS控制器。这是"对"使用FOS的方法(在twig中修改表单的路径,而不是在PHP中链接它,对我来说似乎很脏)?

2 个答案:

答案 0 :(得分:1)

如果您的控制器正在扩展" base"注册控制器来自 FOSUserBundle (例如FOS\UserBundle\Controller\RegistrationController)然后你有一个ContainerAware对象,但正如你所指出的那样,不是提供某些便利方法的基本Symfony控制器。

基本控制器的getDoctrine()方法只是从容器中返回学说服务的便捷方法,例如

public function getDoctrine()
{
    if (!$this->container->has('doctrine')) {
        throw new \LogicException('The DoctrineBundle is not registered in your application.');
    }

    return $this->container->get('doctrine');
}

所以回答你的问题:

  1. 为您的RegistrationController添加便捷方法,与上述方法类似,或者只需将$this->getDoctrine()调用替换为从容器返回doctrine服务的FOSUserBundle
  2. 是的,如果您有不同的观点,那么您所做的就完全可以接受了。
  3. 作为替代方案,您可以通过将FOSUserBundle指定为捆绑包的父级来简单地使用您自己的class MyUserBundle extends Bundle { public function getParent() { return 'FOSUserBundle'; } } 进行扩展,因为您可能已经完成了此操作,例如

    register.html.twig

    执行此操作应该允许您通过将自定义视图(如果您使用twig)放置在与源包中找到的位置相同的位置来简单地覆盖资源。这样,您可以保持行为,而无需修改控制器,同时自定义视图。

    当然,如果你需要额外的业务逻辑,或者需要做任何自定义的事情,你可能不得不以任何方式覆盖控制器。

答案 1 :(得分:0)

要回答您的第一个问题 - 您在控制器中有$this->container,因此,您可以使用Doctrine访问$doctrine = $this->container->get('doctrine');

相关问题