Zend framework2 ZF2子路由-ajax不';t返回正确的路由名称

Zend framework2 ZF2子路由-ajax不';t返回正确的路由名称,zend-framework2,zend-route,Zend Framework2,Zend Route,我认为Zend Framework 2有一个奇怪的问题。调用ajax函数后,路由名称不正确。 以下是我的路线的一部分: 'ajax' => array( 'type' => 'Literal', 'options' => array( 'route' => '/ajax', 'defaults' => array(

我认为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
}
phtml,这是我表单的代码,我只显示ajax请求的url

<input type="hidden" name="url" value="<?php echo $this->url('ajax/'.$this->route_name, array('name' => $this->route_param , 'page' =>$this->pages['current'])); ?>">
当我在
domain.com/category
时,我的ajax url是:

$this->url('ajax/category', array(...))
$this->url('ajax/subcategory', array(...))
当我在
domain.com/subcategory
时,我的ajax url是:

$this->url('ajax/category', array(...))
$this->url('ajax/subcategory', array(...))
奇怪的部分来了。如上所示,我的ajax操作获取当前路由名称。无论是从
domain.com/subcategory
还是从
domain.com/category
发送请求,值始终是路由的最后一个子项。
在本例中

$route = $this->getEvent()->getRouteMatch()->getMatchedRouteName();
总是

string 'ajax/category' (length=13)
我是否应该根据
$this->url()
参数获取路由名称?如果是,我如何获得此信息?

我已经阅读了,但没有看到任何关于返回子路由的最后一个子名称的信息。

类别和子类别具有相同的模式,因此在获取请求的url时,路由器无法找到正确的路由名称,并且在调用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(
                    ),
                ),
            ),
在当前代码状态下,将正确生成url,并正确检测路由