有一种方法可以知道已经使用了哪些堆栈索引。我最近写了下面的方法,就是这种情况:
/**
*
* 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堆栈索引问题的更好解决方案。类常量会使它更清晰/更具可读性。
感谢您的回复!我也想到了这个解决方案,但是使用这种方法仍然很难在frontcontroller插件之间创建依赖关系:模块前端控制器插件应该(默认情况下)不知道彼此的存在,但应该有选择地注册之前或之后的另一个模块前端控制器插件。问题是,在注册时(bootstrap),甚至不确定插件X或Y是否已经注册,因此使用了免费的堆栈索引。 – 2011-04-09 20:16:13
@Aron Rotteveel我不明白这是一个问题。为了找到一个免费的堆栈索引,这些模块不必意识到彼此。如果他们需要在某个其他插件之前或之后注册,则无法让他们完全不知道对方,至少是某种插件性质。您可以扩展前端控制器,并直接在那里建立我的功能版本和其他功能,以查询某些特定的插件或插件,以及它们是否已注册。如果这没有意义,我可能没有得到你的要求。 – markus 2011-04-11 09:23:28