2011-05-11 66 views
1

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

没有的.htaccess重定向因为条件需要对PHP进行测试

这是我想什么:

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

// else, continue dispatch as normal... 

这里的想法是,我们可以设置整个网站将所有内容发送到启动页面,直到指定的日期/时间,此时它本质上会自动启动。

回答

2

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

library/My/Plugin/ConditionallyRedirect.php

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

当然,其它偏好/对类名前缀和文件位置将需要对自动加载稍有不同的步骤要求:

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和调用。

+0

这会很好地工作 – Ascherer 2011-05-12 11:22:31

+2

preDispatch太晚了。你可以使用routeStartup() – 2011-05-12 13:12:16

+0

+1 @TomášFejfar这是一个很好的观点。除非条件实际上取决于路线的完成。但是你是对的:我从最初的问题中推断出'routeStartup()'更好。改变答案。谢谢! ;-) – 2011-05-12 13:45:52

5

为什么要打扰路由?只是一个简单的重定向。

也许这样的事情在bootstrap.php中:

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

,或者你可以只是坚持if语句在你的index.php的顶部,并避免加载框架完全

+0

+1一个简单的解决方案“白名单”,但我去插件由于一些更多的复杂性,我需要处理 – Ryan 2011-05-13 14:10:44

+0

有点半途而废,但它的工作原理我猜 – Ascherer 2011-05-13 17:25:25

+0

不,它大约1/16分。 OP想要一个醒目的页面直到日期X(或午夜的中风,或其他)。日期条件不依赖于应用程序中的任何内容,因此使用更多的屁股而不是绝对必要的过度工程。 – timdev 2011-05-13 19:11:48

1

如果你想要做到这一点,你必须在创建请求后在课堂上完成,以便在发送响应之前修改它。通常不太在引导。编号说,把它放在一个可以访问前端控制器的插件(类似于ACL的工作方式)

1

谢谢@David Weinraub,我带着和你的插件类似的插件。我不得不改变周围虽然有两件事情,这是我的最终结果(我的一些特殊应用的东西简化这里的例子)

<?php 

/** 
* Lanch project within valid dates, otherwise show the splash page 
*/ 

class App_Launcher extends Zend_Controller_Plugin_Abstract 
{ 
// The splash page 
private $_splashPage = array(
    'module' => 'default', 
    'controller' => 'coming-soon', 
    'action' => 'index' 
); 

// These pages are still accessible 
private $_whiteList = array(
    'rules' => array(
     'module' => 'default', 
     'controller' => 'sweepstakes', 
     'action' => 'rules' 
    ) 
); 


/** 
* Check the request and determine if we need to redirect it to the splash page 
* 
* @param Zend_Controller_Request_Http $request 
* @return void 
*/ 
public function preDispatch(Zend_Controller_Request_Http $request) 
{ 
    // Redirect to Splash Page if needed 
    if (!$this->isSplashPage($request) && !$this->isWhiteListPage($request) && !$this->isSiteActive()) { 

     // Create URL for Redirect 
     $urlHelper = new Zend_View_Helper_Url(); 
     $url = $urlHelper->url($this->_splashPage); 

     // Set Redirect 
     $front = Zend_Controller_Front::getInstance(); 
     $response = $front->getResponse(); 
     $response->setRedirect($url); 

    } 
} 


/** 
* Determine if this request is for the splash page 
* 
* @param Zend_Controller_Request_Http $request 
* @return bool 
*/ 
public function isSplashPage($request) { 

    if($this->isPageMatch($request, $this->_splashPage)) 
     return true; 

    return false; 

} 


/** 
* Check for certain pages that are OK to be shown while not 
* in active mode 
* 
* @param Zend_Controller_Request_Http $request 
* @return bool 
*/ 
public function isWhiteListPage($request) { 

    foreach($this->_whiteList as $page) 
     if($this->isPageMatch($request, $page)) 
      return true;    

    return false; 

} 


/** 
* Determine if page parameters match the request 
* 
* @param Zend_Controller_Request_Http $request 
* @param array $page (with indexes module, controller, index) 
* @return bool 
*/ 
public function isPageMatch($request, $page) { 

    if( $request->getModuleName() == $page['module'] 
     && $request->getControllerName() == $page['controller'] 
     && $request->getActionName() == $page['action']) 
     return true; 

    return false; 
} 


/** 
* Check valid dates to determine if the site is active 
* 
* @return bool 
*/ 
protected function isSiteActive() { 

    // We're always active outside of production 
    if(!App_Info::isProduction()) 
     return true; 

    // Test for your conditions here... 
    return false; 
      // ... or return true; 

} 

} 

有余地了一些改进,但是这会适合我现在的需求。一个侧面说明,我不得不将函数改回到preDispatch,因为$ request在routeStartup中没有可用的模块,控制器和动作名称,这是确保我们不再将请求重定向到启动页面的必要条件(引起无限重定向循环)

(也只是添加了其他的网页应该仍然可以访问)

+0

看起来很酷我。 ;-) – 2011-05-13 03:46:43