2013-06-06 3 views
1

젠드 프레임 워크 2 라우터에 대한 질문이 있습니다.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을 포함 할 : 나는 그런 MySQL의에서 테이블 "seourl"가.

는 URL 필드에 내가 같은 URL을 가질 수있다 : 다른 사람이/제품/사전에

덕분에 (내가이 테이블에서 어떤 형태의 URL이든 경로를 원하는).

나중에 편집 :

내가이 테이블에서 경로 각 URL을 원하는.

예 :

example.com/test123이로드 모듈 catalog/제어기 product/액션 view/PARAM example.com/other가로드 5

모듈 catalog/제어기 category/액션 view/매개 변수 10

+0

URL의 종류를 지정하려면 "모듈"열을 추가하십시오. 질문이 뭐야 ? 어떻게 ? –

+0

@RemiThomas가 테이블을 편집했습니다 (모듈에서 컨트롤러가 변경됨). –

+0

아니요. url | module | controller | action | param –

답변

4

이 작업을 수행하는 한 가지 방법은 이벤트를 첨부하는 것입니다 (우선 순위가> 0 인 가져 오기 ant!)를 응용 프로그램의 'route'이벤트에 추가합니다. 이 긍정적 우선 순위는 라우트 일치가 발생하기 전에 핸들러가 실행되도록합니다. 즉, 자신의 라우트를 추가 할 수 있습니다.

다음과 같은 메시지가 표시됩니다. 이것은 어디서나 테스트되지 않으므로 몇 가지 사항을 정리해야 할 수도 있습니다.

<?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

10k URL을 사용하면 상황을 다르게 할 수 있습니다. URL 당 하나의 리터럴 경로를 추가하는 대신 RouteInterface를 구현하여 고유 한 경로 유형을 만드는 것을 고려하십시오. – timdev

+0

예를 들어 보냅니까? 나는 젠드 프레임 워크 2에서 새로워졌습니다. 고마워요! –