繁体   English   中英

覆盖FOSUserBUndle控制器Symfony 2

[英]Overriding FOSUserBUndle Controllers Symfony 2

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

我不知道为什么,在重写之后,交响乐会忽略我的控制器。 这不是第一次,我也试图覆盖其他人......从未找到解决方案......

<?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”显示良好...

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

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

$a = new BaseClass();

VS

$a = new NewClass();

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

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

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

阅读更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM