Zend framework Zend-有条件地重新路由所有页面

Zend framework Zend-有条件地重新路由所有页面,zend-framework,redirect,reroute,Zend Framework,Redirect,Reroute,我希望能够重新路由或重定向到我的网站的所有请求到一个特定的页面,如果有条件通过。我假设这必须在引导程序或调度程序的某个地方完成,但我不确定最好/最干净的方法是什么 否。htaccess重定向,因为需要在PHP中测试条件 以下是我想要的: if( $condition ) { // Redirect ALL Pages/Requests } // else, continue dispatch as normal... 这里的想法是,我们可以设置整个网站,并将所有内容发送到初始页面,直

我希望能够重新路由或重定向到我的网站的所有请求到一个特定的页面,如果有条件通过。我假设这必须在引导程序或调度程序的某个地方完成,但我不确定最好/最干净的方法是什么

否。htaccess重定向,因为需要在PHP中测试条件

以下是我想要的:

if( $condition ) {
    // Redirect ALL Pages/Requests
}

// else, continue dispatch as normal...

这里的想法是,我们可以设置整个网站,并将所有内容发送到初始页面,直到指定的日期/时间,在这一点上,它本身基本上会“自动启动”。

为什么要麻烦路由?只是一个简单的重定向

在Bootstrap.php中可能会出现类似的情况:

public function initSplash(){
    if($splashtime && $requestIsNotForComingSoonAlready){
        header('Location: /coming-soon',true,302);
        die();
    }
}

或者您可以将if语句放在index.php的顶部,避免完全加载框架

为什么还要麻烦路由呢?只是一个简单的重定向

在Bootstrap.php中可能会出现类似的情况:

public function initSplash(){
    if($splashtime && $requestIsNotForComingSoonAlready){
        header('Location: /coming-soon',true,302);
        die();
    }
}

或者您可以将if语句粘贴在index.php的顶部,避免完全加载框架

如果您想以正确的方式进行加载,则必须在创建请求后在类中进行加载,以便在发送响应之前对其进行修改。通常不完全在引导中。我想把它放在一个可以访问前端控制器的插件的地方(类似于ACL的工作方式)

如果你想用正确的方式来做,你必须在创建请求后在类中做,这样你才能在发送响应之前修改它。通常不完全在引导中。我想把它放在一个可以访问前端控制器的插件的地方(类似于ACL的工作方式)

事实上,我想要一个插件

库/My/Plugin/ConditionallyRedirect.php
中:

class My_Plugin_ConditionallyRedirect extends Zend_Controller_Plugin_Abstract
{
    public function routeStartup(Zend_Http_Request_Abstract $request)
    {
        // perform your conditional check
        if ($this->_someCondition()){
             $front = Zend_Controller_Front::getInstance();
             $response = $front->getResponse();
             $response->setRedirect('/where/to/go');
        }
    }

    protected function _someCondition()
    {
        // return the result of your check
        return false; // for example
    }

}
然后在
application/configs/application.ini
中注册您的插件:

autoloaderNamespaces[]                        = "My_"
resources.frontController.plugins.conditional = "My_Plugin_ConditionallyRedirect"

当然,对于类名前缀和文件位置的其他首选项/要求,自动加载和调用的步骤会略有不同。

事实上,我会选择一个插件

库/My/Plugin/ConditionallyRedirect.php
中:

class My_Plugin_ConditionallyRedirect extends Zend_Controller_Plugin_Abstract
{
    public function routeStartup(Zend_Http_Request_Abstract $request)
    {
        // perform your conditional check
        if ($this->_someCondition()){
             $front = Zend_Controller_Front::getInstance();
             $response = $front->getResponse();
             $response->setRedirect('/where/to/go');
        }
    }

    protected function _someCondition()
    {
        // return the result of your check
        return false; // for example
    }

}
然后在
application/configs/application.ini
中注册您的插件:

autoloaderNamespaces[]                        = "My_"
resources.frontController.plugins.conditional = "My_Plugin_ConditionallyRedirect"

当然,对于类名前缀和文件位置的其他首选项/要求,自动加载和调用的步骤会略有不同。

谢谢@David Weinraub,我使用了与您类似的插件。不过,我不得不改变一些事情,下面是我的最终结果(在这里的示例中,我简化了一些特定于应用程序的内容)


谢谢@David Weinraub,我使用了与您类似的插件。不过,我不得不改变一些事情,下面是我的最终结果(在这里的示例中,我简化了一些特定于应用程序的内容)


preDispatch为时已晚。您可以使用routeStartup()+1@TomášFejfar,这是一个很好的观点。除非条件实际上取决于正在完成的路由。但你是对的:我从最初的问题推断,
routeStartup()
更好。改变答案。谢谢!;-)谢谢@David Weinraub,我根据你的建议提出了一个解决方案。我必须检查最初的请求是为了什么,以确保我没有无限重定向,而且我似乎只能在preDispatch()中进行重定向,而不能在routeStartup()中进行重定向。看看我的解决方案,让我知道你的想法。您可以使用routeStartup()+1@TomášFejfar,这是一个很好的观点。除非条件实际上取决于正在完成的路由。但你是对的:我从最初的问题推断,
routeStartup()
更好。改变答案。谢谢!;-)谢谢@David Weinraub,我根据你的建议提出了一个解决方案。我必须检查最初的请求是为了什么,以确保我没有无限重定向,而且我似乎只能在preDispatch()中进行重定向,而不能在routeStartup()中进行重定向。看看我的解决方案,让我知道你的想法。+1是一个简单的解决方案,但我使用了插件,因为我需要处理一些更复杂的问题,它大约是1/16。OP希望在第X天(或午夜钟声,或其他任何时候)之前有一个启动页面。日期条件不依赖于应用程序中的任何内容,因此使用任何超出严格必要的ass都有过度工程的味道。如果你真的想获得技术,你应该在另一台具有不同域的机器上拥有一个登录页和你的框架/subdomain@Ascherer-这是一个完美的解决方案,但我不同意“应该”这样做,就像我的建议一样,也不同意使用cron作业来交换httpd.conf并重新启动apache(或其他什么)。给猫剥皮的方法很多,等等。我没有说它不起作用,我只是暗示这不是一个简单的解决方案“应该”的方式+1,但是我使用了这个插件,因为我需要处理一些更复杂的问题。雷诺,它大约是我同意的1/16。OP希望在第X天(或午夜钟声,或其他任何时候)之前有一个启动页面。日期条件不依赖于应用程序中的任何内容,因此使用任何超出严格必要的ass都有过度工程的味道。如果你真的想获得技术,你应该在另一台具有不同域的机器上拥有一个登录页和你的框架/subdomain@Ascherer-这是一个完美的解决方案,但我不同意“应该”这样做,就像我的建议一样,也不同意使用cron作业来交换httpd.conf并重新启动apache(或其他什么)。给猫剥皮的方法很多,等等。我没有说这不管用,我只是暗示这不是“应该”的方式