对于我的帐户和日志记录,我使用的FOSUserBundle符合我的所有要求。
我创建的注册表只有很少的输入(用户名,电子邮件和密码),不会吓到长注册表格的访客。但是,对于使用新创建的帐户,客户需要提供有关其公司,地址等的信息,因此在首次登录后我想将我的客户重定向到帐户编辑页面,他或她可以填写所有必需的输入,但不允许在个人资料未完成时访问其他帐户页面。
我已经找到了一个很好的例子,如何在登录后重定向客户端,但每次客户端登录时都会这样做,打赌我只有在客户端配置文件没有完成时才需要这样做。
登录后重定向用户的代码:
firewalls:
secured_area:
form_login:
always_use_default_target_path: true
default_target_path: /loggedinpage
答案 0 :(得分:3)
前段时间我有一个相似的要求。我的解决方案是使用请求侦听器,它检查一些前提条件并适当地重定向。
的src / Acme公司/ HelloBundle /事件监听/ 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] }