2013-06-05 2 views
0

Есть ли способ написать маршрут Zend с динамическим составным действием, что означает действие, которое объединяет более одного сопоставленного шаблона или сочетание совпадающего шаблона со статическим текстом?Zend-маршрут с динамическим комбинированным действием?

Пример:

uri -> desired action 
/company/unique-product-code/overview -> product-overview 
/company/unique-product-code/gallery -> product-gallery 
/company/unique-product-code/... -> product-... 

Текущий код (который не работает):

$regexp = new Zend_Controller_Router_Route_Regex(
    '^(company)/([a-z-]+)/([a-z-]+)/?', 
    array(), 
    array(1 => 'controller', 2 => 'productCode', 'product-3' => 'action') 
); 
+0

- код продукта all alpha и lower? – Orangepill

+0

Я могу изменить шаблон на [a-zA-Z -] +, но это не проблема –

+0

, и это последний маршрут, добавляемый к маршрутизатору? – Orangepill

ответ

0

Я на самом деле не думаю, что это возможно с помощью стандартных классов маршрута. Вы можете либо расширить маршрутизатор, расширить класс маршрута регулярных выражений, либо использовать плагин контроллера для управления именем согласованного действия; но на самом деле было бы намного проще, если бы вы могли изменить имена действий в вашем контроллере, чтобы они соответствовали действиям в URL-адресах.

+0

Спасибо. Я дам некоторое время на этот вопрос, чтобы повесить и сделать еще несколько исследований, прежде чем отмечать его, как ответ. –

1

У меня есть несколько ответов на ваш вопрос. Я думаю, все зависит от того, как вы хотите структурировать свое программное обеспечение Zend Framework.

С моей точки зрения, у вас есть контроллер под названием «Компания». Затем он имеет различные действия, которые включают в себя productOverviewAction() и т. Д.

Итак, вот несколько решений «почти там», а затем я разрешу вашу текущую дилемму. :)

Первый вариант ответа

Вы можете использовать контроллер компании для компании конкретной информации. Возможно, вы сделаете контроллер под названием Product для информации о продукте. Затем вы действительно захотите перейти к чему-то вроде/product/[unique-id]/overview - nice URL. Вот маршрут совпадающее:

$route = new Zend_Controller_Router_Route(
    'product/:productCode/:action', 
    array(
     'controller'=>'product' 
    ) 
); 

Как вы видите, это даже не регулярное выражение, так что он может быть быстро!

Второй возможный ответ

Причина, по которой нужно регулярное выражение, потому что действие не соответствует URL, но сделан из части. Однако, допустим, что вы изменили компании :: productOverviewAction() в компании :: OverviewAction() - вы затем можете использовать этот маршрут:

$route = new Zend_Controller_Router_Route(
    'company/:productCode/:action', 
    array(
     'controller'=>'company' 
    ) 
); 

Однако, я знаю, что это не совсем то, что вы просили ...

The Almost Exact Ответ

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

$route = new Zend_Controller_Router_Route(
    'company/:productCode/:action', 
    array(
     'controller'=>'company' 
    ) 
); 

И затем, поскольку он получает направленность на каждое действие, вы можете проксировать действия в CompanyController. Например:

public function overviewAction() 
{ 
    return $this->productOverviewAction(); 
} 

* Примечание: Я не использовал _forward(), чтобы не переотправки (я думаю, что бывает ...)

удачи!

+0

В настоящее время я использую ваше решение №2, которое также было упомянуто в ответе @TimFountain, который я выполнил, прежде чем задавать этот вопрос. Тем не менее, я решил задать вопрос именно из-за того, что теперь знаю, возможно ли решение. +1 для получения времени и деталей. –

+0

Спасибо! Я продумал это, и я действительно ХОЧУ его решить, но я все думал: он просто не будет работать, не создавая новый маршрутизатор ... рад, что у вас есть что-то, что работает. :) –

Смежные вопросы