Работа с префиксами и Zend_Controller_Router_Route

На существующем веб-сайте Zend Framework с несколькими контроллерами и без модулей мне нужно добавить некоторые префиксы к маршрутам по умолчанию.

Например, у меня в настоящее время есть:

/products
/products/id/1
/training
/commonpage

Я хочу добавить уровень продуктовой линейки, не дублируя мои контроллеры в модулях x (я просто запросю нужную линейку продуктов внутри своих контроллеров с _getParam ).

Так что мои новые пути будут такими:

/line1/products
/line1/products/id/1
/line2/training
/commonpage

На данный момент я попробовал этот маршрут (расположенный в моем файле Bootstrap):

protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('productLineRoute', new Zend_Controller_Router_Route(
':line/:controller/:action',
array('module' => 'default'),
array('line' => '(' . implode('|', Zend_Registry::getInstance()->constants->lines) . ')')
));
}

Но без какого-либо успеха (это дает мне 404).
Как я могу построить единый маршрут, который соответствует всем URI в этих условиях:

  • Префикс URI соответствует значению в моем массиве линий продуктов
  • Маршрут действителен только в том случае, если к запрошенному контроллеру разрешен доступ «способом линейки продуктов» — например, массивом, содержащим имена моих контроллеров.

Хорошо, мне удалось очень близко понять, что я пытаюсь сделать с этим кодом:

protected function _initConstants()
{
$registry = Zend_Registry::getInstance();
$registry->constants = new Zend_Config( $this->getApplication()->getOption('constants') );
$uri = ltrim($_SERVER['REQUEST_URI'], '/');
$product_line = substr($uri, 0, strpos($uri, '/'));
if(!empty($product_line) && in_array($product_line, Zend_Registry::getInstance()->constants->lines->toArray()) &&
$product_line != Zend_Registry::getInstance()->constants->lines->get(0)) {
$registry->product_line = $product_line;
} elseif(!isset($registry->gamme)) {
$registry->product_line = Zend_Registry::getInstance()->constants->lines->get(0);
}
}

protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$registry = Zend_Registry::getInstance();
$router->addRoute('productLineRoute', new Zend_Controller_Router_Route(
':line/:controller/:action/*',
array(
'module' => 'default', 'action' => 'index',
'line'  => (isset($registry->product_line)) ? $registry->product_line : Zend_Registry::getInstance()->constants->lines->get(0)
),
array(
'line'      => '(' . implode('|', Zend_Registry::getInstance()->constants->lines->toArray()) . ')',
'controller' => '(' . implode('|', array('products', 'training')) . ')'
)
));
}

С этим я могу получить доступ /line1/products но нет /line1/commonpageЭто то, что я хочу, так что ограничение контроллера работает отлично. Как вы можете видеть, я добавляю имя линейки продуктов в Zend Registry, поэтому оно сохраняется, когда я использую URL View Helper в шаблонах (таким образом, мне не нужно редактировать все мои шаблоны для добавления параметра линейки продуктов в мой помощник). звонки).

У меня сейчас проблема с этим помощником: кажется, что мое ограничение контроллера просто игнорируется. Когда я делаю это в моем шаблоне:

<a href="<?php echo $this->url(array('controller'=> 'commonpage', 'action'=>'index'),null, true) ; ?>">My link</a>

Я в конечном итоге с этим:

<a href="/line1/commonpage">My link</a>

Таким образом, продуктовая линейка добавлена, несмотря на то, что это не разрешено ограничением контроллера моего маршрута.

14

Решение

Хорошо, я нашел решение: я изменил URL Helper, чтобы добавить ограничение контроллера внутри него. Если контроллер не соответствует массиву «контроллеров продуктовых линий», он принудительно assemble использовать маршрут по умолчанию (не идеально, но у меня работает):

public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true, $default = false)
{
$router = Zend_Controller_Front::getInstance()->getRouter();
if(isset($urlOptions['controller']) && !in_array($urlOptions['controller'], array('products', 'training'))) {
$name = 'default';
}
return $router->assemble($urlOptions, $name, $reset, $encode);
}
1

Другие решения

Вы можете добавить / изменить конкретный маршрут с помощью файла ini params:

resources.router.routes.job_en.route               = "/prefix/:request-offer"resources.router.routes.job_en.defaults.module     = "core"resources.router.routes.job_en.defaults.controller = "engine"resources.router.routes.job_en.defaults.action     = "main"

где job_en это название моего маршрута и request-offer имя параметра

0

По вопросам рекламы [email protected]