J'ai étendu Zend_Controller_Action
avec ma classe de contrôleur et apporté les modifications suivantes:
Dans la méthode dispatch($action)
remplacé
$this->$action();
avec
call_user_func_array(array($this,$action), $this->getUrlParametersByPosition());
et a ajouté la méthode suivante
/**
* 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;
}
Maintenant, pour une URL comme /mycontroller/myaction/123/321
dans mon action, je vais obtenir tous les params suivants contrôleur et action
public function editAction($param1 = null, $param2 = null)
{
// $param1 = 123
// $param2 = 321
}
Les paramètres supplémentaires dans l'URL ne provoqueront aucune erreur car vous pouvez envoyer plus de paramètres à la méthode, puis les définir. Vous pouvez tous obtenir par func_get_args()
Et vous pouvez toujours utiliser getParam()
d'une manière habituelle. Votre URL ne doit pas contenir de nom d'action en utilisant celui par défaut.
En fait, mon URL ne contient pas de noms de paramètres. Seules leurs valeurs. (Exactement comme c'était dans la question) Et vous devez définir des routes pour spécifier les positions des paramètres dans l'URL pour suivre les concepts de framework et pouvoir construire des URL en utilisant les méthodes Zend. Mais si vous connaissez toujours la position de votre paramètre dans l'URL, vous pouvez facilement l'obtenir comme ceci.
Ce n'est pas aussi sophistiqué que l'utilisation de méthodes de réflexion, mais je suppose que cela fournit moins de frais généraux.
méthode d'expédition ressemble maintenant à ceci:
/**
* 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();
}
Nice, les documents ne sont pas si claires à l'égard. –