Php 从Symfony中的服务重定向

Php 从Symfony中的服务重定向,php,redirect,service,symfony,Php,Redirect,Service,Symfony,我在基本控制器的构造函数中请求了一个服务,以确保它始终运行。此服务检查数据库中的某些内容,可能会出错。如果出现错误,我想将用户重定向到显示此错误的页面。我找不到任何方法来实现这一点,因为重定向只能从控制器的操作返回。我想要的是能够从操作外部“返回”重定向。我需要做什么才能从我的服务重定向?我是否必须以不同的方式实现我的服务,或者根本不需要?我不想在每次操作时手动调用此方法 相关代码: // Every other controller in my bundle extends this one

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

相关代码:

// 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
        }
    }
}

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

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

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


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

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

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


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

我将创建一个自定义
重定向异常
,您可以在服务中抛出,捕获控制器。自定义异常类应包含重定向的url。@jszobody如何从控制器实际执行此重定向?我们在那一点上又没有行动了。@jszobody谢谢,我试试看。如果您同时添加此作为答案,我将在检查是否可以使其工作后接受它。@jszobody这是一个多么棒的主意!我将创建一个自定义的
重定向异常
,您可以在服务中抛出,在控制器中捕获。自定义异常类应包含重定向的url。@jszobody如何从控制器实际执行此重定向?我们在那一点上又没有行动了。@jszobody谢谢,我试试看。如果您同时添加此作为答案,我将在检查是否可以使其工作后接受它。@jszobody这是一个多么棒的主意!我同意所说的一切,除了控制员应该负责每一个回应这一事实。如果您查看安全包,就会发现重定向是基于内核事件执行的,就像@jszobody指出的那样。我现在知道的基于操作之外的服务(或任何逻辑)进行重定向的唯一方法是在内核事件侦听器中处理其异常。我同意上面所说的一切,除了控制器应该负责每个响应这一事实。如果您查看安全包,就会发现重定向是基于内核事件执行的,就像@jszobody指出的那样。我现在知道的基于操作之外的服务(或任何逻辑)进行重定向的唯一方法是在内核事件侦听器中处理其异常。