情况:
目前的做法:
问题:
其他模块应该能够基于在上述文件解析例程中修改的数据库实体执行一些例程; 如何在完成后注册执行的前端控制器插件?
Zend_Controller_Plugin
个对象以LIFO顺序执行。我应该采取另一种方法吗?
注意:我确实意识到registerPlugin()
需要第二个$stackIndex
参数,但由于无法知道堆栈的当前位置,这实际上不是一个非常干净的解决方法问题。
答案 0 :(得分: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堆栈索引问题。类常量会使它更清晰/更易读。