2013-11-20 56 views
0

我有奇怪的(在我看來)與Zend Framework 2的問題。我調用我的ajax函數路由名稱是不正確的。
這裏是我的路由的一部分:ZF2子路由 - 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,我沒有看到有關返回子路由最後一個子名稱的任何信息。

回答

0

類別和子類別具有相同的模式,因此路由器在獲取請求的url時無法找到正確的路由名稱,並始終返回最後一個找到的條目(Last In First Out),當調用url插件構建url時,你沒有這個問題,因爲你要命名你想建立的路線。

如果你想要有相同的URL請求類別和子類別,你必須找到另一種方式來區分它們,例如傳遞名稱參數。

通過您可以很容易地通過設置你克服這種方式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(
        ), 
       ), 
      ), 

在您的網址將被正確生成,你的路由將被正確檢測到您的代碼當前狀態。