Ich habe die Zend_Controller_Action
mit meiner Controller-Klasse und nahm die folgenden Änderungen vor:
En dispatch($action)
Methode ersetzt
$this->$action();
mit
call_user_func_array(array($this,$action), $this->getUrlParametersByPosition());
Und fügte die folgende Methode hinzu
/**
* 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;
}
Jetzt für eine URL wie /mycontroller/myaction/123/321
in meiner Aktion erhalte ich alle Parameter nach Controller und Aktion
public function editAction($param1 = null, $param2 = null)
{
// $param1 = 123
// $param2 = 321
}
Zusätzliche Parameter in der URL führen nicht zu einem Fehler, da Sie mehr Parameter an die Methode senden können als definiert. Sie können alle Parameter erhalten durch func_get_args()
Und Sie können weiterhin getParam()
auf die übliche Weise. Ihre URL darf keinen Aktionsnamen enthalten, wenn Sie den Standardnamen verwenden.
Meine URL enthält eigentlich keine Parameternamen. Nur ihre Werte. (Genau wie es in der Frage stand) Und man muss Routen definieren, um die Positionen der Parameter in der URL zu spezifizieren, um den Konzepten des Frameworks zu folgen und um in der Lage zu sein, URLs mit Zend-Methoden zu erstellen. Aber wenn man immer die Position des Parameters in der URL kennt, kann man ihn leicht wie folgt erhalten.
Das ist nicht so ausgeklügelt wie die Verwendung von Reflexionsmethoden, aber ich schätze, dass es weniger Overhead bedeutet.
Die 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();
}