2016-01-22 4 views
0

У меня возникла проблема с добавлением пользовательской маршрутизации в мое приложение. Zend Framework 1:Zend Framework 1 добавить одно настраиваемое правило для маршрутизации

У меня уже работает приложение с маршрутизацией по умолчанию Zend. У меня есть много контроллеров и для некоторых из них я хочу использовать дружественные URLs, например: domain.com/cities/edit/ идентификатор/3 в domain.com/cities/edit/ Абу-Даби

Есть некоторые контроллеры для переключения на этот URL-адрес (в этом формате).

Я пытался настроить его ини файла:

resources.router.routes.slugurl.route = /:controller/:action/:slug 

А также методом Bootstrap:

protected function _initSlugRouter() 
{ 
    $this->bootstrap('FrontController'); 
    $router = $this->frontController->getRouter(); 
    $route = new Zend_Controller_Router_Route('/:controller/:action/:slug/', 
     array(
      'controller' => 'slug', 
      'action' => 'forward', 
      'slug' => ':slug' 
     ) 
    ); 
    $router->addRoute('slug',$route); 

} 

Основная проблема - с ини конфигурации - запрос идет непосредственно к контроллеру города (не тихоход). Второй (bootstrap) - также выполняет городской контроллер, но по умолчанию маршрутизация не работает так, как была, я не могу выполнить: domain.com/cities/, но domain.com/cities/index/ работает. Ошибка без действия определяется:

Action "forward" does not exist and was not trapped in __call() 

я могу контролировать «слизняк» в контроллерах/переместить проверить в какую-то библиотеку, но я хотел бы сделать это только с маршрутизацией - это путь выглядит намного лучше для меня .. Пожалуйста, , как решить эту проблему?


редактировать с резюме решения Спасибо вам Max P. для интересной. Я решил это наконец - за последние 2 минуты :) У меня были неправильные правила в application.ini с маршрутизацией. Сейчас определено, что:

resources.router.routes.slugurl.route = /:controller/:action/:slug 
resources.router.routes.slugurl.defaults.controller = :controller 
resources.router.routes.slugurl.defaults.action = :action 
resources.router.routes.slugurl.defaults.slug = :slug 

Контроллер определяется так:

class CitiesController extends Crm_Abstract 

Crm_Abstract имеет код:

<?php 

class Crm_Abstract extends Zend_Controller_Action { 

    public function __construct(\Zend_Controller_Request_Abstract $request, \Zend_Controller_Response_Abstract $response, array $invokeArgs = array()) { 

     $params = $request->getParams(); 

     if (!empty($params['slug'])) { 
      $modelSlug = Crm_Helper_Slug::getInstance(); 
      $parameters = $modelSlug->redirectRequest($request); 
      if ($parameters !== false) { 
       foreach ($parameters as $key => $value) { 
        $request->setParam($key, $value); 
       } 
      } 
     } 
     parent::__construct($request, $response, $invokeArgs); 

    } 

    public function __call($methodName, $args) { 

     parent::__call($methodName, $args); 
    } 


} 

Помощник пробкового получить параметры для слизняка на определенном контроллере , URL-адрес для доступа к slug определяется/вычисляется вместо $ this-> url-to $ this-> slug, а остальная часть кода выполняется в slug-помощнике. Я не уверен, что мое решение на 100% уверенно, потому что это мой первый раз с маршрутизацией.

Главное, что мне просто нужно было изменить Zend_Controller_Action на Crm_Abstract, который расширяет Zend_Controller_Action. Одиночная строка - в каждом контроллере нет дополнительного пользовательского кода.

+0

Если прокомментировать этот маршрут, то какая ошибка появляется для url domain.com/ города/редактировать/абу-даби? –

+0

Я добавлю ошибку, только когда я получу действительный код ошибки - я не могу отформатировать его на комментарий :( – Mik

+0

Я все еще не могу понять маршрутизацию ZF - всегда только одна вещь не работает хорошо - когда я добавляю маршрутизацию : 'resources.router.routes.slugurl.route = /: controller /: action /: slug' ' resources.router.routes.slugurl.defaults.controller =: controller' 'resources.router.routes.slugurl. defaults.action =: action' 'resources.router.routes.slugurl.defaults.slug =: slug' Я не могу получить доступ к URL: domain.com/developers/ - код ошибки: Action« action »не существует и не попал в ловушку __call(). Похоже, что добавление правила маршрута - уничтожает маршрутизацию по умолчанию, но я хочу, чтобы он сохранялся. – Mik

ответ

1

Я создал два правила маршрута:

resources.router.routes.slugurl.type = "Zend_Controller_Router_Route" 
resources.router.routes.slugurl.route = /:controller/:action/:slug/ 
resources.router.routes.slugurl.defaults.module = "default" 
resources.router.routes.slugurl.defaults.controller = :controller 
resources.router.routes.slugurl.defaults.action = :action 
resources.router.routes.slugurl.defaults.slug = :slug 


resources.router.routes.plain1.route = "/:controller/:action/" 
resources.router.routes.plain1.defaults.module = "default" 
resources.router.routes.plain1.defaults.controller = "index" 
resources.router.routes.plain1.defaults.action = "index" 

А пока что работает отлично. Плохая вещь - я не понимаю маршрутизации (правила htaccess), но время, потраченное на эту проблему, и решить ее лучше, чем изменить все контроллеры ...

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