2013-11-20 4 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, есть код моей формы, я покажу только URL запроса Ajax

<input type="hidden" name="url" value="<?php echo $this->url('ajax/'.$this->route_name, array('name' => $this->route_param , 'page' =>$this->pages['current'])); ?>"> 

Итак, как вы можете видеть, что я передать переменную с именем дочернего маршрута от действий для просмотра, то мой URL выглядит следующим образом:

$this->url('ajax/'.$this->route_name, array(...)) 

Когда я в domain.com/category мой АЯКС Ссылка:

$this->url('ajax/category', array(...)) 

Когда я в domain.com/subcategory мой АЯКС Ссылка:

$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

Категория и подкатегория имеют один и тот же шаблон, поэтому маршрутизатор не может найти правильное имя маршрута при получении запрошенного 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(
        ), 
       ), 
      ), 

В коде текущего состояния Ваш URL будет сгенерирован правильно, и ваши маршруты будут правильно определены.