【问题标题】:ZF2 dynamic routingZF2动态路由
【发布时间】:2013-09-22 10:24:02
【问题描述】:

我在 ZF2 中的路由有问题。我想为我正在制作的软件制作动态路由。

例如: 这是网址:http://localhost:8080/application/index.json/ 这是我的 module.config(路由器部分):

'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_-]*'
                    ),


                ),
            ), 

      ), 
 ), 

一切正常,但是当我创建新控制器时,必须将其添加到 module.config 中的 controllers['invokables'] 设置中。

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

所以问题是,如何自动化控制器['invokables'] 来动态处理请求,而不需要描述其中的每个控制器。

【问题讨论】:

    标签: php controller routing zend-framework2


    【解决方案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__,
                    ),
                ),
            );
        }
    }
    

    【讨论】:

    • 我试过这个,但是在你的代码之后,我有我在其中制作的 postProcessor 函数: $di = $e->getTarget()->getServiceLocator()->get('di');如果使用您的路由,我会收到此错误:调用非对象上的成员函数 get()。经过一点调试,我发现“$e->getTarget()->getServiceLocator()”为NULL。
    • 你应该将服务定位器添加到控制器。查看我的更新。
    • @akond 那么仅通过配置不可能实现这一点?为什么带有 :controller 参数的路由适用于骨架应用程序应用程序模块(但不适用于任何其他模块)? github.com/zendframework/ZendSkeletonApplication/blob/master/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多