2011-04-07 23 views
1

情况的执行顺序:控制Frontcontroller插件

  • 我的应用程序包含几个模块,每个模块的应尽可能多自成体系越好。
  • 对于每个请求,应用程序都应解析文件。根据文件的内容,应该创建,更新或删除一些数据库实体。

电流的方法:

  • 我在模块引导程序中的一个,其是鉴于上述的护理注册一个前端控制器插件。

问题:

其它模块应当能够执行基于被上述文件解析例程修改的数据库实体的一些例程; 如何在之后注册执行的前端控制器插件?

Zend_Controller_Plugin对象以LIFO顺序执行。我应该采取另一种方法吗?

注意:我知道registerPlugin()需要第二个$stackIndex参数,但由于没有办法知道堆栈的当前位置,所以这实际上并不是解决问题的非常干净的方法。

回答

2

有一种方法可以知道已经使用了哪些堆栈索引。我最近写了下面的方法,就是这种情况:

/** 
    * 
    * Returns the lowest free Zend_Controller_Plugin stack index above $minimalIndex 
    * @param int $minimalIndex 
    * 
    * @return int $lowestFreeIndex | $minimalIndex 
    */ 
    protected function getLowestFreeStackIndex($minimalIndex = 101) 
    { 
     $plugins = Zend_Controller_Front::getInstance()->getPlugins(); 
     $usedIndices = array(); 

     foreach ($plugins as $stackIndex => $plugin) 
     { 
      $usedIndices[$stackIndex] = $plugin; 
     } 

     krsort($usedIndices); 

     $highestUsedIndex = key($usedIndices); 

     if ($highestUsedIndex < $minimalIndex) 
     { 
      return $minimalIndex; 
     } 

     $lowestFreeIndex = $highestUsedIndex + 1; 

     return $lowestFreeIndex; 

    } 

基本上,你问的是部分Zend_Controller_Front::getInstance()->getPlugins();有了,你可以做你想做的,该数组包含所有使用的堆栈指数作为键。

该函数开始从101返回堆栈索引,因为Zend Framework错误控制器插件使用100,我需要注册更高的索引。这当然有点神奇,但即使Zend Framework教程/手册也没有针对101堆栈索引问题的更好解决方案。类常量会使它更清晰/更具可读性。

+0

感谢您的回复!我也想到了这个解决方案,但是使用这种方法仍然很难在frontcontroller插件之间创建依赖关系:模块前端控制器插件应该(默认情况下)不知道彼此的存在,但应该有选择地注册之前或之后的另一个模块前端控制器插件。问题是,在注册时(bootstrap),甚至不确定插件X或Y是否已经注册,因此使用了免费的堆栈索引。 – 2011-04-09 20:16:13

+0

@Aron Rotteveel我不明白这是一个问题。为了找到一个免费的堆栈索引,这些模块不必意识到彼此。如果他们需要在某个其他插件之前或之后注册,则无法让他们完全不知道对方,至少是某种插件性质。您可以扩展前端控制器,并直接在那里建立我的功能版本和其他功能,以查询某些特定的插件或插件,以及它们是否已注册。如果这没有意义,我可能没有得到你的要求。 – markus 2011-04-11 09:23:28