ZF2子路由 - ajax不返回正确的路由名称

时间:2013-11-20 16:36:57

标签: zend-framework2 zend-route

我在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/subcategorydomain.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,但我没有看到有关返回子路径的最后一个子名称的任何信息。

1 个答案:

答案 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(
                    ),
                ),
            ),

在您的代码当前状态中,您的网址将正确生成,并且您的路线将被正确检测到。