首页 > 解决方案 > 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 文档中关于这个主题的正确实现。

我相信是这种情况,因为我试图从服务中重定向,而不是控制器。

如何从服务中重定向?

标签: phpsymfonyservicesymfony4php-7.1

解决方案


不。从控制器返回truefalse重定向

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');
}

控制器负责进行重定向,而不是其他层。


推荐阅读