php - Symfony PHP - 从服务中重定向
问题描述
我有一个带有授权服务的 Symfony 4 应用程序,我想处理一些更高级别的逻辑,以确定给定用户是否有权访问给定路由。
我在一个BaseController
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\Services\Authorize;
class BaseController extends Controller {
private $auth;
public function __construct(Authorize $auth){
$this->auth = $auth;
}
public function initBaseController() {
$this->auth->do_authorize();
}
}
Authorize
服务看起来像这样:
namespace App\Services;
use Symfony\Component\HttpFoundation\RedirectResponse;
use App\Services\Session;
class Authorize {
private $session;
public function __construct(Session $session){
$this->session = $session;
}
public function do_authorize(){
if($this->session->validate('fake_token'){
return $this->redirectToRoute('login-portal'); // ** ERROR **
}
}
}
BaseController
因此,如果会话不存在或使用Authorize
服务无效,则想法是使用全局实现此过程并重定向到登录页面。
但是重定向行会抛出一个错误,尽管这是symfony 文档中关于这个主题的正确实现。
我相信是这种情况,因为我试图从服务中重定向,而不是控制器。
如何从服务中重定向?
解决方案
不。从控制器返回true
或false
重定向
public function initBaseController()
{
$auth = $this->auth->do_authorize();
if($auth) {
return $this->redirectToRoute('login-portal');
}
}
public function do_authorize()
{
return $this->session->validate('fake_token');
}
控制器负责进行重定向,而不是其他层。