我已经扩展Zend_Controller_Action
了我的控制器类并进行了以下更改:
在dispatch($action)
方法替换
$this->$action();
和
call_user_func_array(array($this,$action), $this->getUrlParametersByPosition());
并添加了以下方法
/**
* 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;
}
现在对于像这样的网址/mycontroller/myaction/123/321
在我的操作中,我将获得控制器和操作之后的所有参数
public function editAction($param1 = null, $param2 = null)
{
// $param1 = 123
// $param2 = 321
}
URL 中的额外参数不会导致任何错误,因为您可以将更多参数发送到然后定义的方法。您可以通过 获得所有这些func_get_args()
并且您仍然可以getParam()
以通常的方式使用它们。您的 URL 可能不包含使用默认名称的操作名称。
实际上我的 URL 不包含参数名称。只有他们的价值观。(就像问题一样)并且您必须定义路由以指定 URL 中的参数位置,以遵循框架的概念并能够使用 Zend 方法构建 URL。但是如果你总是知道你的参数在 URL 中的位置,你可以很容易地得到它。
这不像使用反射方法那么复杂,但我想提供的开销更少。
Dispatch 方法现在看起来像这样:
/**
* 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();
}