Php Symfony2-强制用户完成配置文件

Php Symfony2-强制用户完成配置文件,php,symfony,fosuserbundle,access-control,Php,Symfony,Fosuserbundle,Access Control,我正在努力找到一个可重用的,而不是硬编码的解决方案来解决这个问题 在我的注册页面,我要求尽可能少的信息让用户注册。 完成该步骤后,将创建一个用户 在他们可以使用应用程序的其他部分之前,我希望他们完成他们的配置文件。 (我知道让它成为可选的可能更好,但是对于这个用例,它是强制性的) 当他们注册时,我已经有一个标志profileComplete设置为false,但我觉得在每个控制器中执行此标志检查是强制配置文件完成的一种不好的方式 Symfony中是否有更面向对象的方法使用EventSubscrib

我正在努力找到一个可重用的,而不是硬编码的解决方案来解决这个问题

在我的注册页面,我要求尽可能少的信息让用户注册。 完成该步骤后,将创建一个用户

在他们可以使用应用程序的其他部分之前,我希望他们完成他们的配置文件。 (我知道让它成为可选的可能更好,但是对于这个用例,它是强制性的)

当他们注册时,我已经有一个标志profileComplete设置为false,但我觉得在每个控制器中执行此标志检查是强制配置文件完成的一种不好的方式


Symfony中是否有更面向对象的方法使用EventSubscriber或自定义角色(USER_PENDING)来解决此问题?如何为该角色设置附加防火墙?

当然,我已经设置了

1)首先创建您的侦听器:

<?php

namespace Sybio\Bundle\WebsiteBundle\Services\Listener;

use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\Routing\Router;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\HttpKernel;

/**
 * User listener : redirect user depending on his informations
 */
class UserListener
{
    /**
     * @var Container
     */
    private $container;

    /**
     * @var Router
     */
    private $router;

    /**
     * Constructor
     * 
     * @param Container $container
     * @param Router $router
     */
    public function __construct(Container $container, Router $router)
    {
        $this->container = $container;
        $this->router = $router;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if ($this->container->get('security.context')->getToken()
            && $this->container->get('security.context')->isGranted('ROLE_PENDING')
            && $event->getRequest()->attributes->get('_controller') != 'Sybio\Bundle\WebsiteBundle\Controller\UserController::completeInformationAction'
            && $event->getRequest()->attributes->get('_controller') != 'Sybio\Bundle\WebsiteBundle\Controller\SecurityController::logoutAction'
            && HttpKernel::MASTER_REQUEST == $event->getRequestType()
        ) {
            $event->setResponse(new RedirectResponse($this->router->generate('sybiowebsite_user_complete_information')));
        }
    }
}
# services.yml or config.yml
sybio.user_listener:
        class: Sybio\Bundle\WebsiteBundle\Services\Listener\UserListener
        arguments:
            - @service_container
            - @router
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}
3)最后一步是定义用户配置文件不完整的时间,从而赋予其角色\u PENDING:

// Entity -> User.php :

    /**
     * Get Roles (security)
     * 
     * @return array
     */
    public function getRoles()
    {
        $roles = array();

        // Manage your roles ...

        if (!$this->email) { // or what you want
            $roles[] = 'ROLE_PENDING';
        }

        return $roles;
    }

就这样

如果我必须这样做,我可能会选择角色解决方案!请正确执行依赖项注入。你为什么有这个容器?为什么不在接口上键入提示(
RouterInterface
securitycontenterface
)?此外,我认为匹配路由比完整的操作名称更简单,即
$event->getRequest()->attributes->get(“u路由”)