Zend framework 在zend framework中实现action stack时出现意外输出。actionstack的正确流程是什么?它是如何工作的?

Zend framework 在zend framework中实现action stack时出现意外输出。actionstack的正确流程是什么?它是如何工作的?,zend-framework,Zend Framework,下面的代码可以使操作堆栈正常工作,但问题是输出以意外的方式出现。。在代码的末尾,解释我得到的输出和期望的输出。第一次使用动作堆栈,我不知道请求是如何处理的 MY Plugin Class ----------------------- class My_Plugins_ActionStack extends Zend_Controller_Plugin_Abstract { public function dispatchLoopStartup(

下面的代码可以使操作堆栈正常工作,但问题是输出以意外的方式出现。。在代码的末尾,解释我得到的输出和期望的输出。第一次使用动作堆栈,我不知道请求是如何处理的

        MY Plugin Class
    -----------------------
    class My_Plugins_ActionStack extends Zend_Controller_Plugin_Abstract
    {

    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {

                    $action_stack = new Zend_Controller_Action_Helper_ActionStack();
                    $action_stack->actionToStack('index', 'index', 'default', array('position' => 'right'));
                    $action_stack->actionToStack('index', 'index', 'user', array('position' => 'left'));
                    $action_stack->actionToStack('index', 'index', 'hr', array('position' => 'center'));

    }
    Base Controller
    ------------------

    class My_Controller_Base extends Zend_Controller_Action
    {
     public function preDispatch()
        {

           $position = $this->_request->getParam('position', false);


            if ($position) {
                    $this->_helper->viewRenderer->setResponseSegment($position);
            }


        }


        public function init()
        {


        }
    }
    Default Controller
    ---------------------------
    class Default_IndexController extends Mlive_Controller_Base
    {



        public function init()
        {
            /* Initialize action controller here */
        }

        public function indexAction()
        {

        }


    }
    index.phtml in default controller
    ============
    This is default module
    HR Controller
    -----------------
    class Hr_IndexController extends Mlive_Controller_Base
    {

        public function init()
        {
            /* Initialize action controller here */
        }

        public function indexAction()
        {
        }


    }
    index.phtml in hr controller
    ============
    this is hr module
    User Controller
    ----------------------
    class User_IndexController extends Mlive_Controller_Base
    {

        public function init()
        {
            /* Initialize action controller here */
        }

        public function indexAction()
        {

        }


    }
    index.phtml in user controller
    ============
    This is user module
    -----------------------------------------------
    And finally the layout looks like

    Layout.phtml
    ------------------------
    This is basic layout
    <div>
        <h2><u>LEFT:</u></h2>
        <?=$this->layout()->left?>
    </div>
    <div>
        <h2><u>CENTER:</u></h2>
        <?=$this->layout()->center?>
    </div>
    <div>
        <h2><u>RIGHT:</u></h2>
         <?=$this->layout()->right?>
    </div>
    <div>

OUTPUT 
---------------------------
 Output  for default module
 --------------------------
 This is basic layout
LEFT:
This is user module
CENTER:
RIGHT:
this is hr moduleThis is user module
Content:
This is default module


-----------------------------------------------
Output for user module
------------------------------------------------
This is basic layout
LEFT:
this is hr module
CENTER:
RIGHT:
this is hr moduleThis is default module
Content:
This is user module
---------------------------------
Output for hr module
-----------------------------------
This is basic layout
LEFT:
This is user module
CENTER:
RIGHT:
this is hr moduleThis is default module
Content:
this is hr module

DESIRED OUTPUT
----------------
---------------------------
 Output  for default module
 --------------------------
 This is basic layout
LEFT:
This is user module
CENTER:
this is hr module
RIGHT:
This is default module
Content:
This is default module


-----------------------------------------------
Output for user module
------------------------------------------------
 This is basic layout
LEFT:
This is user module
CENTER:
this is hr module
RIGHT:
This is default module
Content:
This is user module
---------------------------------
Output for hr module
-----------------------------------
 This is basic layout
LEFT:
This is user module
CENTER:
this is hr module
RIGHT:
This is default module
Content:
this is hr module
我的插件类
-----------------------
类My_Plugins_ActionStack扩展Zend_Controller_Plugin_Abstract
{
公共函数dispatchLoopStartup(Zend_控制器_请求_抽象$Request)
{
$action\u stack=new Zend\u Controller\u action\u Helper\u ActionStack();
$action_stack->actionToStack('index','index','default',array('position'=>'right');
$action_stack->actionToStack('index','index','user',array('position'=>'left');
$action_stack->actionToStack('index','index','hr',array('position'=>'center');
}
基本控制器
------------------
类My_Controller_Base扩展Zend_Controller_操作
{
公共职能预分配()
{
$position=$this->\u请求->获取参数('position',false);
如果($职位){
$this->\u helper->viewRenderer->setResponseSegment($position);
}
}
公共函数init()
{
}
}
默认控制器
---------------------------
类Default\u IndexController扩展了Mlive\u Controller\u基
{
公共函数init()
{
/*在此初始化操作控制器*/
}
公共函数索引()
{
}
}
默认控制器中的index.phtml
============
这是默认模块
人力资源控制员
-----------------
类Hr\u IndexController扩展了Mlive\u Controller\u基
{
公共函数init()
{
/*在此初始化操作控制器*/
}
公共函数索引()
{
}
}
人力资源控制器中的index.phtml
============
这是人力资源模块
用户控制器
----------------------
类用户\u索引控制器扩展Mlive\u控制器\u库
{
公共函数init()
{
/*在此初始化操作控制器*/
}
公共函数索引()
{
}
}
用户控制器中的index.phtml
============
这是用户模块
-----------------------------------------------
最后,布局看起来像
Layout.phtml
------------------------
这是基本布局
左:
中心:
正确的:
输出
---------------------------
默认模块的输出
--------------------------
这是基本布局
左:
这是用户模块
中心:
正确的:
这是人力资源模块这是用户模块
内容:
这是默认模块
-----------------------------------------------
用户模块的输出
------------------------------------------------
这是基本布局
左:
这是人力资源模块
中心:
正确的:
这是人力资源模块这是默认模块
内容:
这是用户模块
---------------------------------
人力资源模块的输出
-----------------------------------
这是基本布局
左:
这是用户模块
中心:
正确的:
这是人力资源模块这是默认模块
内容:
这是人力资源模块
期望输出
----------------
---------------------------
默认模块的输出
--------------------------
这是基本布局
左:
这是用户模块
中心:
这是人力资源模块
正确的:
这是默认模块
内容:
这是默认模块
-----------------------------------------------
用户模块的输出
------------------------------------------------
这是基本布局
左:
这是用户模块
中心:
这是人力资源模块
正确的:
这是默认模块
内容:
这是用户模块
---------------------------------
人力资源模块的输出
-----------------------------------
这是基本布局
左:
这是用户模块
中心:
这是人力资源模块
正确的:
这是默认模块
内容:
这是人力资源模块

Actionstack应该始终保持不变,因为每次您请求它时,它都会经过分派循环,这会产生大量开销


在视图中使用带有
$this->Partial()
$this->render()
的局部视图,或者在需要自定义功能时使用。

如果仅使用来自同一控制器的操作,则可以使用:

public function someAction() 
{
    $this->defaultAction('right');
    $this->userAction('center');
    $this->hrAction('left');
}

public function defaultAction($position)
{
    // your code
}
但最好是行动助手或服务。
对于多个模块,您可以使用侦听器或适配器


但是,看起来您正试图实现只需切换布局即可实现的目标。

要回答ActionStack是如何工作的吗?

操作堆栈以后进先出的顺序执行您的操作。因此,在您的示例中,您按以下顺序添加模块:Default、User、HR-它们将按HR、User、Default、您的请求操作的顺序执行。默认情况下,您的请求操作已存在于堆栈上,并在最后执行

您的输出可能不是预期的,因为您的“位置”参数在堆栈上的最后一个操作运行时设置,但在实际操作运行之前-它卡在“右侧”-因此您的操作的所有输出都被附加到该段

如其他地方所述,操作堆栈既重又慢,因为它们向
dispatchLoop
过程添加了大量额外的迭代


一种更好的方法是使用
占位符和
部分
以及将您想要的一些公共代码移动到公共库中。

我需要操作堆栈,因为我必须同时运行多个模块。如何使用$this->partial()或$this->render()运行多个模块有了上述要求?还有其他方法可以导入吗