【问题标题】:Redirect from service in Symfony从 Symfony 中的服务重定向
【发布时间】:2016-06-10 12:52:50
【问题描述】:

我的基本控制器的构造函数中请求了一项服务,以确保它始终运行。该服务会检查数据库中的一些内容,并且可能会出错。如果出错,我想将用户重定向到显示此错误的页面。我找不到任何方法来实现这一点,因为重定向只能从控制器的操作中返回。我想要的是能够从动作外部“返回”重定向。我需要做什么才能从我的服务重定向?我必须以不同的方式实现我的服务,还是根本不需要?我不想在每个操作上手动调用此方法。

相关代码:

// Every other controller in my bundle extends this one    
class Controller extends SymfonyController
{
    public function setContainer(ContainerInterface $container = null)
    {
        parent::setContainer($container);

        $this->containerInitialized();
    }

    protected function containerInitialized()
    {
        // Initialize my.service before running action of every page
        try {
            $this->get('my.service');
        } catch (SomeException $ex) {
            // I want redirection to happen here
        }
    }
}

编辑:我知道我可以使用控制器内核事件在每个页面上运行某些东西,这就是我将要使用的。但这仍然不能解决重定向的情况。

【问题讨论】:

  • 我会创建一个自定义RedirectException,您可以将其放入您的服务中,并在控制器中捕获。自定义异常类应包含重定向的 url。
  • @jszobody 我将如何从控制器实际执行此重定向?那时我们还没有采取行动。
  • @jszobody 谢谢,我会试试的。如果您同时将此添加为答案,我会在检查是否可以正常工作后接受它。
  • @jszobody 真是个好主意!

标签: php redirect service symfony


【解决方案1】:

服务不应该决定是否应该发生重定向或如何处理客户端的请求和响应。服务旨在仅向控制器提供服务,该服务可以独立于控制器的调用方式使用。

如果您有一个服务可以触发重定向到特定站点,您如何在另一个控制器、另一个站点甚至在不存在重定向的命令行界面中使用该服务?你不能,那很糟糕。

服务中的错误处理旨在通过自定义异常来完成。如果服务达到无法正常继续的地步,则会引发异常,描述发生的错误,但不描述应如何处理错误。如何处理错误/异常的决定应该由控制器或命令来完成,具体取决于控制器上下文中的意义。如果服务可能导致不同类型的错误,则这些不同类型应通过异常(或异常中的数据)来区分,控制器可以根据该异常(或异常中的数据)做出重定向(或不重定向)的决定。服务或异常不应强加给控制器应如何处理错误,只提供信息供控制器或命令自行决定。

【讨论】:

  • 我同意所说的一切,除了控制器应该负责每个响应这一事实。如果您查看安全包,您会看到重定向是基于内核事件执行的,就像@jszobody 指出的那样。我现在知道的基于动作之外的服务(或任何逻辑)发生重定向的唯一方法是在内核事件侦听器中处理其异常。
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多