覆盖 FOSUserBUndle 控制器 Symfony 2

Overriding FOSUserBUndle Controllers Symfony 2

我想覆盖 FOS\UserBundle\Controller\RegistrationController 以添加一些功能(管理我在注册表中添加的字段等)。

我不知道为什么,在覆盖它之后,symphony 忽略了我的控制器。这不是第一次了,我也试过顶别人...一直没找到解决办法...

<?php
namespace FP\UserBundle\Controller;

use Symfony\Component\HttpFoundation\RedirectResponse;
use FOS\UserBundle\Controller\RegistrationController as BaseController;


    class RegistrationController extends BaseController
    {
        public function registerAction()
        {
            $response = parent::registerAction();

            echo "FPUserBundle";
            // do custom stuff

            return $response;
        }
    }

.

<?php

namespace FP\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

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

.

<?php

/*
 * This file is part of the FOSUserBundle package.
 *
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace FOS\UserBundle\Controller;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use FOS\UserBundle\Model\UserInterface;

/**
 * Controller managing the registration
 *
 * @author Thibault Duplessis <thibault.duplessis@gmail.com>
 * @author Christophe Coevoet <stof@notk.org>
 */
class RegistrationController extends Controller
{
    public function registerAction(Request $request)
    {
        echo "FOSUserBundle";
        /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
        $formFactory = $this->get('fos_user.registration.form.factory');
        /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
        $userManager = $this->get('fos_user.user_manager');
        /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
        $dispatcher = $this->get('event_dispatcher');

        $user = $userManager->createUser();
        $user->setEnabled(true);//active l'user

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

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

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

        $form->handleRequest($request);

        if ($form->isValid()) {
            $event = new FormEvent($form, $request);
            //--- ajout des données pour les champs ajoutés ---
                $user->setDateInscrip(new \DateTime());
                $user->setRoles(array('ROLE_USER'));
            //--------- Fin de l'ajout ---------
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

            $userManager->updateUser($user);

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

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

            return $response;
        }

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

    /**
     * Tell the user to check his email provider
     */
    public function checkEmailAction()
    {
        $email = $this->get('session')->get('fos_user_send_confirmation_email/email');
        $this->get('session')->remove('fos_user_send_confirmation_email/email');
        $user = $this->get('fos_user.user_manager')->findUserByEmail($email);

        if (null === $user) {
            throw new NotFoundHttpException(sprintf('The user with email "%s" does not exist', $email));
        }

        return $this->render('FOSUserBundle:Registration:checkEmail.html.twig', array(
            'user' => $user,
        ));
    }

    /**
     * Receive the confirmation token from user email provider, login the user
     */
    public function confirmAction(Request $request, $token)
    {
        /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
        $userManager = $this->get('fos_user.user_manager');

        $user = $userManager->findUserByConfirmationToken($token);

        if (null === $user) {
            throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
        }

        /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
        $dispatcher = $this->get('event_dispatcher');

        $user->setConfirmationToken(null);
        $user->setEnabled(true);

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

        $userManager->updateUser($user);

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

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

        return $response;
    }

    /**
     * Tell the user his account is now confirmed
     */
    public function confirmedAction()
    {
        $user = $this->getUser();
        if (!is_object($user) || !$user instanceof UserInterface) {
            throw new AccessDeniedException('This user does not have access to this section.');
        }

        return $this->redirect($this->generateUrl('fp_user_inscrip', array('user' => $user)));
        /*
        return $this->render('FPPlatformBundle:Index:index.html.twig', array(
            'user' => $user,
        ));*/
    }
}

尽管有这些代码,当我 运行 检查时, "FPUserBundle" 没有显示,而 "FOSUserBundle" 显示得很好 ...

覆盖 类(控制器也是 class!)将为新 class base-class 拥有的所有未来(除了直接访问私有方法或属性)。但是不要忘记 base-class 仍然可以在新的 class 旁边使用。它依赖于你实例化的class。

$a = new BaseClass();

$a = new NewClass();

所以问题是 Symfony 将使用哪一个?这就是您可以通过路由管理的内容。只要这在你的 app/config/routing.yml:

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

Symfony 将使用原始的 FOSUserBundle 控制器。只需在 vendor/FOS.. 目录中找到那些 xml 文件并将它们复制到您自己的项目中即可。将上面显示的规则更改为您自己的包,并更改 xml 文件中的控制器名称。当然你也可以写自己的.yml文件。

read more

检查您是否已将新 Bundle 添加到 app/AppKernel。php::registerBundles 函数。