我在Zend Framework 2中遇到了奇怪的问题(在我看来)。在调用我的ajax函数后,路由名称不正确。
这是我路由的一部分:
'ajax' => array(
'type' => 'Literal',
'options' => array(
'route' => '/ajax',
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'ajax',
),
),
'may_terminate' => true,
'child_routes' => array(
'subcategory' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:name][/:page]',
'constraints' => array(
'name' => '[a-zA-Z][a-zA-Z0-9_-]*',
'page' => '[0-9]+',
),
'defaults' => array(
),
),
),
'category' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:name][/:page]',
'constraints' => array(
'name' => '[a-zA-Z][a-zA-Z0-9_-]*',
'page' => '[0-9]+',
),
'defaults' => array(
),
),
),
),
),
我的控制器代码的一部分
public function categoryAction()
{
$route['route_name'] = 'category';
$view = new ViewModel($route);
$view->setTemplate('application/index/category');
return $view;
}
public function subcategoryAction()
{
$route['route_name'] = 'subcategory';
$view = new ViewModel($route);
$view->setTemplate('application/index/category');
return $view;
}
public function ajaxAction()
{
$route = $this->getEvent()->getRouteMatch()->getMatchedRouteName();
var_dump($route); // return always last child route from config
}
category.phtml,有我的表格代码,我只会显示ajax请求的网址
<input type="hidden" name="url" value="<?php echo $this->url('ajax/'.$this->route_name, array('name' => $this->route_param , 'page' =>$this->pages['current'])); ?>">
所以,正如你所看到的那样,我将带有子路由名称的变量从动作传递到视图,然后我的网址如下所示:
$this->url('ajax/'.$this->route_name, array(...))
当我在domain.com/category
时,我的ajax网址是:
$this->url('ajax/category', array(...))
当我在domain.com/subcategory
时,我的ajax网址是:
$this->url('ajax/subcategory', array(...))
这是奇怪的部分。正如您在上面看到的,我的ajax操作获取当前路由名称。如果从domain.com/subcategory
或domain.com/category
发送请求并不重要,则值始终是路由的最后一个子项。
在此示例中
$route = $this->getEvent()->getRouteMatch()->getMatchedRouteName();
总是
string 'ajax/category' (length=13)
我不知道路线名称取决于$this->url()
参数吗?如果是这样,我怎么能得到这个呢?
我已阅读http://framework.zend.com/manual/2.2/en/modules/zend.mvc.routing.html,但我没有看到有关返回子路径的最后一个子名称的任何信息。
答案 0 :(得分:0)
类别和子类别具有相同的模式,因此路由器在获取请求的URL时无法找到正确的路由名称并且始终返回找到的最后一个条目(Last In First Out),当调用url插件来构建URL时,没有这个问题,因为你命名了你想要建立的路线。
如果你想拥有相同的url来请求类别和子类别,你必须找到另一种区分它们的方法,例如传递name参数。
顺便说一下,你可以通过设置conf来轻松克服这个问题:
'subcategory' => array(
'type' => 'Segment',
'options' => array(
'route' => '/subcategoy/[:name][/:page]',
'constraints' => array(
'name' => '[a-zA-Z][a-zA-Z0-9_-]*',
'page' => '[0-9]+',
),
'defaults' => array(
),
),
),
'category' => array(
'type' => 'Segment',
'options' => array(
'route' => '/category/[:name][/:page]',
'constraints' => array(
'name' => '[a-zA-Z][a-zA-Z0-9_-]*',
'page' => '[0-9]+',
),
'defaults' => array(
),
),
),
在您的代码当前状态中,您的网址将正确生成,并且您的路线将被正确检测到。