8

找了很久没有成功。在我放弃之前,我想问一下:

有没有办法将子域路由到Zend Framework 2中的模块?喜欢:

子域=>模块
api.site.com => api
dev.site.com => dev
admin.site.com => admin
site.com => public
...

我尝试这样做,但我无法访问除默认(索引)以外的控制器。

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

感谢您花时间帮助我。

4

2 回答 2

5

Zend Framework 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 如何注册此侦听器的示例

于 2012-10-25T15:14:11.657 回答
4

如果我正确理解了DASPRIDS Rounter 演示文稿的幻灯片 #39 ,那么它就像 - 在每个模块的基础上 - 定义您的子域主机一样简单,即:

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

等等,您可以为每个模块单独执行此操作。

于 2012-10-25T14:51:06.167 回答