2013-09-22 184 views
0

我在ZF2中有路由問題。我想爲我製作的軟件製作動態路由。

例如: 這是網址:http://localhost:8080/application/index.json/ 這是我module.config(路由器部分):ZF2動態路由

'router' => array(
     'routes' => array(
      'home' => array(
       'type' => 'Zend\Mvc\Router\Http\Segment', 
       'options' => array(
        'route' => '/', 
        'defaults' => array(
         'controller' => 'Application\Controller\Index', 
        ), 
       ), 
      ), 
      'restful' => array(
       'type' => 'Zend\Mvc\Router\Http\Segment', 
       'options' => array(
        'route'  => '/:module/[:controller[/:action][.:formatter][/:id]]', 
        'constraints' => array(

         'module' => '[a-zA-Z][a-zA-Z0-9_-]*', 
         'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
         'formatter' => '[a-zA-Z][a-zA-Z0-9_-]*', 
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
         'id'   => '[a-zA-Z0-9_-]*' 
        ), 


       ), 
      ), 

    ), 
), 

一切工作正常,但是當我創造新的控制器,必須將其添加到控制器['invokables']在module.config中的設置。

'controllers' => array(
    'invokables' => array(
     'index' => 'Application\Controller\IndexController', 
     'cloud' => 'Application\Controller\CloudController', 
    ), 
), 

所以,問題是,如何將控制器自動化[「invokables」]動態地處理請求,沒有描述它的每一個控制器。

回答

1

快速和骯髒,但你明白了。

namespace Application; 

use Zend\Mvc\ModuleRouteListener; 
use Zend\Mvc\MvcEvent; 

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager  = $e->getApplication()->getEventManager(); 

     $eventManager->attach (MvcEvent::EVENT_ROUTE, function (MvcEvent $e) { 
      $controller_loader = $e->getApplication()->getServiceManager()->get ('ControllerLoader'); 

      $controller = $e->getRouteMatch()->getParam ('controller'); 
      $controller_class = '\Application\Controller\\'.ucfirst ($controller).'Controller'; 

      // Add service locator to the controller 
      $controller_object = new $controller_class; 
      $controller_object->setServiceLocator ($e->getApplication()->getServiceManager()); 
      // ------------------------------------ 
      $controller_loader->setService ($controller, $controller_object); 
     }); 
    } 

    public function getConfig() 
    { 
     return include __DIR__ . '/config/module.config.php'; 
    } 

    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
} 
+0

我嘗試這樣做,但你的代碼後,我有我做後處理功能:$迪= $ E->了getTarget() - > getServiceLocator() - >獲取( '迪'); 如果使用你的路由,我得到這個錯誤:調用一個非對象的成員函數get()。經過一些調試,我發現「$ e-> getTarget() - > getServiceLocator()」是NULL。 – pavkatar

+0

然後,您應該將服務定位器添加到控制器。查看我的更新。 – akond

+0

@akond因此,只有配置才能實現這一點?以及爲什麼使用:controller參數進行路由在skelleton應用程序應用程序模塊(但不是任何其他模塊)上工作? https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php –