控制Frontcontroller插件的执行顺序

时间:2011-04-07 12:54:50

标签: php zend-framework

情况:

  • 我的应用程序包含几个模块,每个模块应尽可能自包含。
  • 在每个请求中,应用程序应解析一个文件。根据文件的内容,应创建,更新或删除一些数据库实体。

目前的做法:

  • 我在我的一个模块引导程序中注册了一个前端控制器插件,用于处理上述情况。

问题:

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

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

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

1 个答案:

答案 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堆栈索引问题。类常量会使它更清晰/更易读。