php - 如果 Symfony2 中的帐户不完整,则首次登录后重定向到配置文件编辑页面

标签 php symfony fosuserbundle

对于我的帐户和日志记录,我使用 FOSUserBundle 来满足我的所有要求。

我创建的注册表单只需要很少的输入(用户名、电子邮件和密码),以免长注册表单吓到访客。但是,对于使用新创建的帐户,客户需要提供有关他的公司、地址等的信息,因此第一次登录后我想将我的客户重定向到帐户编辑页面,他或她可以在其中填写所有必需的输入,但不允许访问其他帐户页面,但个人资料不完整。

我找到了如何在登录后重定向客户端的好例子,但这在每次客户端登录时都有效,我打赌只有在客户端配置文件不完整的情况下我才需要这样做。

登录后重定向用户的代码:

firewalls:
    secured_area:
        form_login:
            always_use_default_target_path: true
            default_target_path: /loggedinpage

最佳答案

前段时间我有一个相当类似的需求。我的解决方案是使用请求监听器来检查一些先决条件并适本地重定向。


src/Acme/HelloBundle/EventListener/UserRedirectListener.php

<?php
namespace Acme\HelloBundle\EventListener;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Acme\UserBundle\Entity\User;

class UserRedirectListener
{
  /**
   * @var SecurityContext
   */
  private $securityContext;

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

  /**
   * @var ValidatorInterface $validator
   */
  private $validator;

  /**
   * @param SecurityContext    $securityContext
   * @param Router             $router
   * @param RecursiveValidator $validator
   */
  public function __construct(SecurityContext $securityContext, Router $router, ValidatorInterface $validator) {
    $this->securityContext = $securityContext;
    $this->router          = $router;
    $this->validator       = $validator;
  }

  /**
   * @param GetResponseEvent $event
   */
  public function onKernelRequest(GetResponseEvent $event) {
    if (HttpKernel::MASTER_REQUEST !== $event->getRequestType()) {
      // don't do anything if it's not the master request
      return;
    }

    // get the user
    $user = $this->securityContext->getToken()->getUser();
    if (!$user instanceof User) {
      return;
    }

    // validate
    $errors = $this->validator->validate($user, null, array('email'));
    if (count($errors) === 0) {
      return;
    }

    // get current route
    $route = $event->getRequest()->attributes->get('_route');

    // filter allowed routes
    switch ($route) {
      case 'some_route':
      case 'some_other_route':
        return;
    }

    // redirect
    $event->setResponse(new RedirectResponse($this->router->generate('target_route')));
  }
}

service.xml

<service id="user_redirect_listener" class="%user_redirect_listener.class%">
  <argument type="service" id="security.context" />
  <argument type="service" id="router" />
  <argument type="service" id="validator" />
  <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
</service>

validation.yml

Acme\UserBundle\Entity\User:
    properties:
        email_activated:
           - 'True': { groups: [email] }

关于php - 如果 Symfony2 中的帐户不完整,则首次登录后重定向到配置文件编辑页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25052703/

相关文章:

PHP 显示每个项目的 foreach 输出到屏幕

php - 在 Lumen 作业中发送邮件时出现 BindingResolutionException

Symfony2 : getScheme does not return 'https'

symfony - 如何禁用 symfony2 中某些路由的监听器?

php - symfony swiftmailer : mail not sent in prod-environment

php - 将自定义实体存储库与 FOSUserBundle 结合使用

php - Laravel Sendgrid SMTP 不工作

php mysql高级选择

php - Symfony- 传递一个 id 数组