2014-09-25 52 views
1

我不能創建一個使用URL視圖助手時,父母和孩子的路線有共同/相同PARAMS正確的網址URL子途徑。ZF2視圖助手用相同PARAMS

我的網址配置:

'contact' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/contact[/:contact][/action/:action]', 
     'constraints' => array(
      'contact' => '[0-9]+', 
      'action' => '[a-zA-Z_-]+', 
     ), 
     'defaults' => array(
      'controller' => 'CrmContact', 
      'action'  => 'index', 
     ), 
    ), 
    'may_terminate' => true, 
    'child_routes' => array(
     'task' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/task[/:task][/action/:action]', 
       'constraints' => array(
        'task' => '[0-9]+', 
        'action' => '[a-zA-Z_-]+', 
       ), 
       'defaults' => array(
        'controller' => 'CrmTask', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
    ) 
) 

因爲很明顯兩家母公司和子路由包含參數「行動」,這條線路工程時,在你點擊瀏覽器上使用「/直接接觸這個意思完全正常/ 1 /任務/ 1 /動作/編輯」都是神。嘗試使用視圖助手網址

$this->url('contact/task', array('contact' => $contact->id,'task' => $task->id, 'action' => 'edit')) 

這會產生錯誤的URL雖然,即

/contact/1/action/edit/task/1 instead of 
/contact/1/task/1/action/edit 

助手基本上劫持從孩子的路線行動PARAM並用它來構建此網址時出現的問題父路徑...我不能停止使用帕拉姆「動作」,因爲它是跨路由控制器方法要求的框架方式的一部分....

回答

1

您的路線接觸和您的孩子的路線任務與不同關聯控制器。所以你可以像這樣分開它們。

'contact' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/contact[/:contact][/action/:action]', 
     'constraints' => array(
      'contact' => '[0-9]+', 
      'action' => '[a-zA-Z_-]+', 
     ), 
     'defaults' => array(
      'controller' => 'crm-contact', 
      'action' => 'index', 
     ), 
    ), 
), 
'task' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/task[/:task][/action/:action]', 
     'constraints' => array(
      'task' => '[0-9]+', 
      'action' => '[a-zA-Z_-]+', 
     ), 
     'defaults' => array(
      'controller' => 'crm-task', 
      'action' => 'index', 
     ), 
    ), 
), 

此外,默認路由是控制器/操作。所以單獨的控制器通常處於不同的路線。 如果您需要在任務路線中包含聯繫人ID,則可以將路線更改爲
'route' => 'contact/:contact/task[/:task][/action/:action]', 此外,您可以將任務和聯繫人約束重新命名爲task_id和contact_id以使清晰。

1

我想保持「任務」爲「接觸」孩子航線的原因是因爲任務僅在接觸是有道理的,它基本上是一個多到一的關係。

'contact' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/contact[/:contact]', 
     'constraints' => array(
      'contact' => '[0-9]+', 
     ), 
     'defaults' => array(
      'controller' => 'CrmContact', 
      'action'  => 'index', 
     ), 
    ), 
    'may_terminate' => true, 
    'child_routes' => array(
     'contact_action' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/action/:action', 
       'constraints' => array(
        'contact' => '[0-9]+', 
        'action' => '[a-zA-Z_-]+', 
       ), 
       'defaults' => array(
        'controller' => 'CrmContact', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
     'task' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/task[/:task]/action/:action', 
       'constraints' => array(
        'task' => '[0-9]+', 
        'action' => '[a-zA-Z_-]+', 
       ), 
       'defaults' => array(
        'controller' => 'CrmTask', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
    ) 
), 
:我在更多的子路由打破它解決它