2009-10-31 1 views
4

Я пытаюсь создать маршрут, который будет "покрывать" этот вид URLs:Zend Route Url с регулярным выражением

www.test.com/parent1/parent2/parent3/item

WWW .test.com/Parent1/parent2/parent3/parent4/item1

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

Я полагаю, что единственный способ решить, что является использование Route_Regex, и поэтому я попытался выполнить эту задачу маршрута с чем-то вроде этого:

routes.test.type = "Zend_Controller_Router_Route_Regex" 
routes.test.route = "test/(?:.*)?([^\/]+)" 
routes.test.defaults.module = default 
routes.test.defaults.controller = test 
routes.test.defaults.action = index 
routes.test.map.1 = "path" 
routes.test.map.2 = "item" 
routes.test.reverse = "test/%s%s" 

Я не тестировал это много, потому что я Я не уверен, что я поступаю правильно ... Я понятия не имею, как должно выглядеть это регулярное выражение, и как я должен относиться к этому «пути».

Можете ли вы посоветовать, что мне делать, чтобы удовлетворить спрос на этот тип маршрута? Таким образом, мне нужен этот путь (parent1, parent2 и т. Д.) Только для внешнего вида, а основным параметром является то, что «item» ...

ответ

-2

Я не знаю, что такое zend route (что-то связанное с php?), Но если вы можете использовать обычные функции программирования, то гораздо более простое решение, чем регулярное выражение, чтобы использовать встроенный список/разделения функций, например:

end(explode($Url,'/')) 

Url.split('/').last() 

ListLast(Url,'/') 

и т.д.


Если вам нужен regex, вы можете сделать это просто с этим:

[^/]+$ 

Это даст вам все, что произошло после последнего прокрутки вперед до конца линии.
(Вам нужно только, чтобы избежать / с обратной косой черты, если вы используете его в контексте, который требует отводящей.)


(кстати, в вашем примере, вы получили test/ на старте - это что преднамеренно/требуется?)

+0

Zend Route является частью Zend Framework, которая является хорошо известной PHP Framework. –

+1

Это смешно :) Голосовать – Green

+0

И у этого парня есть 33k rep? Это даже не PHP-код, который вы там написали. –

7

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

Я написал свои маршруты в плагине, Очевидно, вам необходимо добавить модуль в загрузчике для этого, чтобы работать;)

class Plugin_RoutesPage extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeStartup(Zend_Controller_Request_Abstract $request) 
    { 
     $front_controller = Zend_Controller_Front::getInstance(); 
     $router = $front_controller->getRouter(); 

     // Page SEO friendly hierarchical urls 
     $routePageSeoTree = new Zend_Controller_Router_Route_Regex(
      '([-a-zA-Z0-9/]+)/([-a-zA-Z0-9]+)', 
      array(
       // default Route Values 
       'controller' => 'page', 
       'action' => 'open', 
      ), 
      array(
       // regex matched set names 
       1 => 'parents', 
       2 => 'item' 
      ) 
     ); 
     $router->addRoute('page-seo-tree',$routePageSeoTree); 

     // only one level 
     $routeSinglePage = new Zend_Controller_Router_Route_Regex(
      '([-a-zA-Z0-9]+)', 
      array(
       // default Route Values 
       'controller' => 'page', 
       'action' => 'open', 
      ), 
      array(
       // regex matched set names 
       1 => 'item' 
      ) 
     ); 
     $router->addRoute('page-single',$routeSinglePage); 
    } 
} 

Это, как вы можете использовать его в действии вашего контроллера

class PageController extends Zend_Controller_Action 
{ 
    public function openAction() 
    { 
     // the part of the uri that you are interested in 
     $item = $this->_request->getParam('item'); 
    } 
} 

Вот краткий пример того, как включить его в загрузчике

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initPlugins() 
    { 
      $front_controller = Zend_Controller_Front::getInstance(); 

      $front_controller->registerPlugin(new Plugin_RoutesPage(), 1); 
    } 
} 

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

1

Если родительские элементы являются совершенно неважно, простое решение могло бы быть, чтобы удалить их, прежде чем они даже до Zend - то есть переписать URL, так что только каждый видит test/:item

Например, с помощью:

RewriteEngine On 
RewriteRule ^(test/).*/([^/]+) $1$2 [L] 

("/ тест" часть, очевидно, может быть изменена или сделана динамично, как требуется.)

что входит в Файл конфигурации Apache для сайта - или в файле .htaccess на общем хостинге.

Если вы не используете Apache, проверьте функциональность перезаписи URL-адресов для любого веб-сервера, который вы используете, - синтаксис может немного отличаться, но будет аналогичным.