【问题标题】:Symfony PHP - Redirect from within a serviceSymfony PHP - 从服务中重定向
【发布时间】:2018-11-16 13:23:17
【问题描述】:

我有一个带有授权服务的 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 docs 关于此主题的正确实现。

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

如何从服务中重定向?

【问题讨论】:

  • ERROR 是什么意思?找出任何提示或答案所需的 90% 的元素都包含在错误中。所以你应该发布错误信息。

标签: php symfony service symfony4 php-7.1


【解决方案1】:

不要。返回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');
}

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

【讨论】:

  • 好的,我想这最好属于控制器的范围。但假设我想访问服务中的其他一些此类功能。我怎样才能绕过这个限制?
  • 这不是“限制”,而是软件架构。每一层都负责做一些事情。模型(或存储库)将访问数据库。服务将包含业务逻辑。 View 与用户交互。控制器从用户那里获取数据并调用适当的服务。您可以从服务中调用另一个函数,或者服务可以从另一个服务中调用多个函数并返回给控制器。
  • 布尔值是关于一个特定事物的“值”,它是或是真或假,而不是控制方法。因此,除非您的服务类被称为“RedirectIfSomethingWasSuccess”,否则确定是否重定向的布尔值是不干净的。它实际上违背了您的论点“控制器负责执行重定向”-您的服务正在根据它返回的布尔值控制重定向
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多