谢谢@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中没有可用的模块,控制器和动作名称,这是确保我们不再将请求重定向到启动页面的必要条件(引起无限重定向循环)
(也只是添加了其他的网页应该仍然可以访问)
这会很好地工作 – Ascherer 2011-05-12 11:22:31
preDispatch太晚了。你可以使用routeStartup() – 2011-05-12 13:12:16
+1 @TomášFejfar这是一个很好的观点。除非条件实际上取决于路线的完成。但是你是对的:我从最初的问题中推断出'routeStartup()'更好。改变答案。谢谢! ;-) – 2011-05-12 13:45:52