ich Zend_Controller_Action
mit meinem Controller-Klasse erweitert und folgende Änderungen vorgenommen:
In dispatch($action)
Verfahren ersetzt
$this->$action();
mit
call_user_func_array(array($this,$action), $this->getUrlParametersByPosition());
und addierten die folgenden Verfahren
/**
* Returns array of url parts after controller and action
*/
protected function getUrlParametersByPosition()
{
$request = $this->getRequest();
$path = $request->getPathInfo();
$path = explode('/', trim($path, '/'));
if(@$path[0]== $request->getControllerName())
{
unset($path[0]);
}
if(@$path[1] == $request->getActionName())
{
unset($path[1]);
}
return $path;
}
nun für eine URL wie /mycontroller/myaction/123/321
in meiner Aktion, die ich alle params folgende Controller erhalten und Aktion
public function editAction($param1 = null, $param2 = null)
{
// $param1 = 123
// $param2 = 321
}
Zusätzliche Parameter in der URL verursachen keinen Fehler, da Sie mehr Parameter an die Methode senden können, die dann definiert werden. Sie können alle durch func_get_args()
bekommen und Sie können getParam()
in einer üblichen Weise noch verwenden. Ihre URL darf keinen Aktionsnamen mit dem Standardnamen enthalten.
Meine URL enthält eigentlich keine Parameternamen. Nur ihre Werte. (Genau wie es in der Frage war) Und Sie müssen Routen definieren, um Parameterpositionen in URL anzugeben, um den Konzepten des Frameworks zu folgen und URLs mit Zend-Methoden erstellen zu können. Aber wenn Sie immer die Position Ihres Parameters in URL kennen, können Sie es leicht so erhalten.
Das ist nicht so raffiniert wie die Verwendung von Reflektionsmethoden, aber ich denke, es bietet weniger Overhead.
Dispatch-Methode sieht nun wie folgt aus:
/**
* Dispatch the requested action
*
* @param string $action Method name of action
* @return void
*/
public function dispatch($action)
{
// Notify helpers of action preDispatch state
$this->_helper->notifyPreDispatch();
$this->preDispatch();
if ($this->getRequest()->isDispatched()) {
if (null === $this->_classMethods) {
$this->_classMethods = get_class_methods($this);
}
// preDispatch() didn't change the action, so we can continue
if ($this->getInvokeArg('useCaseSensitiveActions') || in_array($action, $this->_classMethods)) {
if ($this->getInvokeArg('useCaseSensitiveActions')) {
trigger_error('Using case sensitive actions without word separators is deprecated; please do not rely on this "feature"');
}
//$this->$action();
call_user_func_array(array($this,$action), $this->getUrlParametersByPosition());
} else {
$this->__call($action, array());
}
$this->postDispatch();
}
// whats actually important here is that this action controller is
// shutting down, regardless of dispatching; notify the helpers of this
// state
$this->_helper->notifyPostDispatch();
}
Nizza, die Dokumentation in der Hinsicht nicht so klar sind. –