2013-06-06 3 views
1

У меня есть вопрос о zend framework 2 router. У меня есть таблица «seourl» в MySQL вроде этого:Zend Framework 2 - настраиваемый маршрутизатор (из mysql)

url    module   controller   action   param 
test123   catalog   product   view   5  
abc123   catalog   product   view   6 
other   catalog   category   view   10 

Я хочу, чтобы включить эти адреса в маршрутизаторе.

В поле URL-адреса я могу иметь URL вроде: другие/продукта/(я хочу, чтобы маршрут любого типа URL из этой таблицы)

Спасибо заранее.

Позже Edit:

Я хочу маршрут каждый URL из этой таблицы.

Пример:

example.com/test123 будет загружать модуль catalog/контроллер product/действие view/парам 5

example.com/other будет загружать модуль catalog/контроллер category/действие view/param 10

+0

Если вам нужен маршрут любого типа, добавьте столбец «module». Каков твой вопрос ? Как ? –

+0

@RemiThomas только что отредактировал таблицу (я изменил контроллер в модуле). –

+0

Нет, я бы сказал, url | module | controller | action | param –

ответ

4

Один из способов сделать это - прикрепить событие (с приоритетом> 0, который является импортным ant!) к событию «маршрут» приложения. Этот положительный приоритет приведет к тому, что обработчик будет выполнен до того, как произойдет сопоставление маршрутов, что означает, что у вас есть возможность добавить свои собственные маршруты.

Что-то вроде следующего. Имейте в виду, что это нигде не проверено, поэтому вам может потребоваться очистить некоторые вещи.

<?php 
namespace MyApplication; 

use \Zend\Mvc\MvcEvent; 
use \Zend\Mvc\Router\Http\Literal; 

class Module { 

    public function onBootstrap(MvcEvent $e){ 
     // get the event manager. 
     $em = $e->getApplication()->getEventManager(); 

     $em->attach(   
      // the event to attach to 
      MvcEvent::EVENT_ROUTE,   

      // any callable works here. 
      array($this, 'makeSeoRoutes'), 

      // The priority. Must be a positive integer to make 
      // sure that the handler is triggered *before* the application 
      // tries to match a route. 
      100 
     ); 

    } 

    public function makeSeoRoutes(MvcEvent $e){ 

     // get the router 
     $router = $e->getRouter(); 

     // pull your routing data from your database, 
      // implementation is left up to you. I highly 
      // recommend you cache the route data, naturally.    
     $routeData = $this->getRouteDataFromDatabase(); 

     foreach($routeData as $rd){ 
         // create each route. 
      $route = Literal::factory(array(
       'route' => $rd['route'], 
       'defaults' => array(
        'module' => $rd['module'], 
        'controller' => $rd['controller'], 
        'action' => $rd['action'] 
       ) 
      )); 

      // add it to the router 
      $router->addRoute($route); 
     } 
    } 
} 

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

+0

Спасибо за ответ. у меня есть вопрос. если у меня будет 10k URL-адресов? –

+1

С URL-адресом 10 тыс., Вы можете сделать что-то по-другому. Вместо добавления одного литерального маршрута на один URL-адрес, подумайте о создании собственного типа маршрута, реализовав RouteInterface. – timdev

+0

Можете ли вы прислать мне пример? Я новичок в zend framework 2. Спасибо! –