/ / Unerwarteter Ausgang beim Implementieren von Aktionsstapeln im zend Framework. Was ist der korrekte Ablauf von actionstack oder wie funktioniert es? - Zend-Framework

Unerwarteter Ausgang beim Implementieren von Aktionsstapeln im zend Framework. Was ist der korrekte Ablauf von actionstack oder wie funktioniert es? - Zend-Framework

Der Aktionsstapel arbeitet mit dem folgenden Codeaber das Problem ist, dass die Ausgabe in einem unerwarteten Getrappel kam. Am Ende des Codes erkläre ich die Ausgabe, die ich bekomme und was die gewünschte Ausgabe war. Mit dem Aktionsstapel zum ersten Mal weiß ich nicht, wie die Anfrage verarbeitet wurde

        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

Antworten:

1 für die Antwort № 1

Um zu antworten Wie funktioniert ActionStack?

Der Aktionsstapel führt Ihre Aktionen in der Reihenfolge "Best-in-First-Out" aus. In Ihrem Beispiel fügen Sie Module in der folgenden Reihenfolge hinzu: Standard, Benutzer, HR - sie werden in der Reihenfolge HR, User, Default, Ihre Anfrage Aktion. Ihre Anfrage Aktion existiert standardmäßig zuerst auf dem Stack und wird ausgeführt letzte.

Ihre Ausgabe ist wahrscheinlich nicht so wie erwartetIhr "Position" -Parameter, der gesetzt wird, wenn die letzte Aktion auf dem Stapel ausgeführt wird, aber bevor Ihre echte Aktion ausgeführt wird - sie bleibt auf "richtig" hängen - so wird die gesamte Ausgabe Ihrer Aktion an dieses Segment angehängt.

Wie bereits an anderer Stelle erwähnt, sind Aktionsstapel schwer und langsam, da sie dem I / O-System eine Menge zusätzlicher Iterationen hinzufügen dispatchLoop verarbeiten.

Ein besserer Weg zu tun, was Sie zu tun versuchen, ist zu verwenden placeholders und partials Sie können auch einen Teil des gewünschten Codes in eine gemeinsame Bibliothek verschieben.


0 für die Antwort № 2

Actionstack sollte immer sein vermieden werden Denn jedes Mal, wenn Sie es anfordern, geht es durch die Dispatch-Schleife, die viel Overhead verursacht.

Verwenden Sie Teilansichten mit $this->partial() oder $this->render() in deinen Ansichten stattdessen oder verwenden Helfer anzeigen wenn Sie benutzerdefinierte Funktionen benötigen.


0 für die Antwort № 3

Wenn Sie nur Aktionen von demselben Controller aus verwenden, können Sie Folgendes verwenden:

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

public function defaultAction($position)
{
// your code
}

Besser wäre aber Helfer oder Service.
Für mehrere Module können Listener oder Adapter verwendet werden.

Sieht jedoch so aus, als ob Sie versuchen, Dinge zu erreichen, die Sie nur tun könnten, indem Sie das Layout wechseln.