重定向页面 Symfony
Redirect page Symfony
程序员们,遇到过这样的问题。用户授权后,我想重定向到包含其数据的页面,但出现错误。这是代码
firewalls:
main:
pattern: /.*
form_login:
login_path: /
check_path: /login_check
default_target_path: /user/{id}/show //How to use the id of my controller. In routing i create it
always_use_default_target_path: true
use_referer: true
logout:
path: /logout
target: /
security: true
anonymous: true
我假设您想重定向到一个页面并显示登录用户的数据。我建议重新路由到非动态路由会更直接;例如 /user/show
.
在这种情况下,您不需要路由中的 id,因为无论您重定向到什么路由,您都可以通过以下方式在控制器中获取经过身份验证的用户对象:
class HomeController extends Controller
{
/**
* @Route("/user/show", name="user_show")
* @Template()
*/
public function userAction()
{
// do stuff...
// send current user object to view
return [
'user' => $this->getUser(),
];
}
我认为这是最直接的方法,您已经拥有当前用户的上下文等。否则 - 我认为您需要一个非常具体的理由才能在此处使用用户 ID - 您可以实现一个登录处理程序,它将允许您拦截登录事件和 运行 一些自定义代码。
为了完整起见,您可以按如下方式执行此操作(未测试,在这种情况下不推荐):
在控制器中创建一个 user/{id}/show
动作,命名为 user_show
。
然后,在您的 AppBundle(或等效)包的 services.yml
中:
app.event_listener.login_success_handler:
class: AppBundle\EventListener\LoginSuccessHandler
arguments:
- @router
tags:
- { name: 'login.handler', channel: 'security' }
然后创建一个AppBundle/EventListener/LoginSuccessHandler.php
class:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
/**
* LoginSuccessHandler
*/
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
public function __construct(Router $router)
{
$this->router = $router;
}
/**
* onAuthenticationSuccess
*
* @param \Symfony\Component\HttpFoundation\Request $request
* @param \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
$routeParams = [
'id' => $token->getUser()->getId(),
];
return new RedirectResponse($this->router->generate('user_show', $routeParams));
}
}
类似的东西。这里的目标是您:
- 拦截登录成功事件
- 获取认证用户
- 手动重定向
重申一下,我没有测试过上面的代码所以 YMMV。我不认为这种方法在这种情况下是必要的——如果您在登录成功时需要一些特定的和自定义的功能,那么登录事件处理程序很有用。但是,您可以轻松地在控制器中获取当前用户上下文,这涵盖了我经验中的大多数用例。
希望这对您有所帮助:)
程序员们,遇到过这样的问题。用户授权后,我想重定向到包含其数据的页面,但出现错误。这是代码
firewalls:
main:
pattern: /.*
form_login:
login_path: /
check_path: /login_check
default_target_path: /user/{id}/show //How to use the id of my controller. In routing i create it
always_use_default_target_path: true
use_referer: true
logout:
path: /logout
target: /
security: true
anonymous: true
我假设您想重定向到一个页面并显示登录用户的数据。我建议重新路由到非动态路由会更直接;例如 /user/show
.
在这种情况下,您不需要路由中的 id,因为无论您重定向到什么路由,您都可以通过以下方式在控制器中获取经过身份验证的用户对象:
class HomeController extends Controller
{
/**
* @Route("/user/show", name="user_show")
* @Template()
*/
public function userAction()
{
// do stuff...
// send current user object to view
return [
'user' => $this->getUser(),
];
}
我认为这是最直接的方法,您已经拥有当前用户的上下文等。否则 - 我认为您需要一个非常具体的理由才能在此处使用用户 ID - 您可以实现一个登录处理程序,它将允许您拦截登录事件和 运行 一些自定义代码。
为了完整起见,您可以按如下方式执行此操作(未测试,在这种情况下不推荐):
在控制器中创建一个 user/{id}/show
动作,命名为 user_show
。
然后,在您的 AppBundle(或等效)包的 services.yml
中:
app.event_listener.login_success_handler:
class: AppBundle\EventListener\LoginSuccessHandler
arguments:
- @router
tags:
- { name: 'login.handler', channel: 'security' }
然后创建一个AppBundle/EventListener/LoginSuccessHandler.php
class:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
/**
* LoginSuccessHandler
*/
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
public function __construct(Router $router)
{
$this->router = $router;
}
/**
* onAuthenticationSuccess
*
* @param \Symfony\Component\HttpFoundation\Request $request
* @param \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
$routeParams = [
'id' => $token->getUser()->getId(),
];
return new RedirectResponse($this->router->generate('user_show', $routeParams));
}
}
类似的东西。这里的目标是您:
- 拦截登录成功事件
- 获取认证用户
- 手动重定向
重申一下,我没有测试过上面的代码所以 YMMV。我不认为这种方法在这种情况下是必要的——如果您在登录成功时需要一些特定的和自定义的功能,那么登录事件处理程序很有用。但是,您可以轻松地在控制器中获取当前用户上下文,这涵盖了我经验中的大多数用例。
希望这对您有所帮助:)