Zend框架2个路由子域模块(Zend Framework 2 Routing subdomains

2019-07-02 14:56发布

搜索了半天没有成功之后。 之前我放弃了,我想问一下:

有没有一种方法来路由子域在Zend框架2的模块? 喜欢:

子域 => 模块
api.site.com => API
dev.site.com => dev的
admin.site.com =>管理员
site.com =>公共
...

我试图做这样的,但我不能让获得比默认值(指数)其他控制器。

'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'Hostname',
            'options' => array(
                'route' => 'site.com',
                'defaults' => array(
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            )
        )
    ),
),

感谢您抽出宝贵时间来帮助我。

Answer 1:

Zend框架2不具备路由到模块的概念; 所有路由映射是一个URI图案(HTTP路由)和一个特定的控制器类之间。 这就是说, Zend\Mvc提供了一个事件监听器( Zend\Mvc\ModuleRouteListener ),其允许用户定义映射到基于给定的图案的多个控制器一个URI的模式等模拟“模块路由”。 要定义这样的路线,您会将这个作为你的路由配置:

'router' => array(
    'routes' => array(
         // This defines the hostname route which forms the base
         // of each "child" route
        'home' => array(
            'type' => 'Hostname',
            'options' => array(
                'route' => 'site.com',
                'defaults' => array(
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                // This Segment route captures the requested controller
                // and action from the URI and, through ModuleRouteListener,
                // selects the correct controller class to use
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/[:controller[/:action]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                            'controller' => 'Index',
                            'action'     => 'index',
                        ),
                    ),
                ),
            ),
        ),
    ),
),

( 点击此处查看@ ZendSkeletonApplication的一个例子 )

这只是等式的一半,虽然。 您还必须使用特定的命名格式注册的每个控制器类的模块中。 这也通过相同的配置文件来完成:

'controllers' => array(
    'invokables' => array(
        'Application\Controller\Index' => 'Application\Controller\IndexController'
    ),
),

该阵列关键是别名ModuleRouteListener将使用找到合适的控制器,并且它必须采用以下格式:

<Namespace>\<Controller>\<Action>

分配给该数组的键的值是控制器类的完全合格的名称。

( 点击此处查看@ ZendSkeletonApplication的一个例子 )

注:如果您使用的不是ZendSkeletonApplication,或已删除它的默认应用程序模块,你需要在你自己的模块一个注册ModuleRouteListener。 点击这里查看示例ZendSkeletonApplication如何注册这个监听器



Answer 2:

如果我没有理解滑动#39 DASPRIDS Rounter演示正确的,这是一样简单-在每个模块为基础-来定义你的子域名主机,即:

'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'Hostname',
            'options' => array(
                'route' => 'api.site.com',
                'defaults' => array(
                    '__NAMESPACE__' => 'Api\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            )
        )
    ),
),

等等,你对自己的每一个模块做到这一点。



文章来源: Zend Framework 2 Routing subdomains to module