我正在开发一个 zf2 项目,我需要配置我的一些模块以在以下场景中处理不同的子域:
- 我有不同的模块,如 API、后端(管理员)、应用程序(核心模块)、博客等。
- 我有多个虚拟主机指向同一个应用程序/公共目录,例如 api.foobar.com、admin.foobar.com
- 我在每个模块中使用唯一的控制器键/别名,如下所示:
...
'controllers' => array(
'invokables' => array(
'home-controller' => 'Application\Controller\IndexController',
),
),
所以,我想根据域(主机名/路由匹配)更改我的应用程序的行为,如果主机名看起来像 api.foobar.com,我的默认控制器应该从一个 restful 控制器派生,如果它是一个通用主页请求,我的身份验证支持的管理控制器应该不调用,如果是移动站点,将家庭控制器更改为移动控制器,使用不同的布局等...
非工作配置(application/config/module.config.php):
return array(
'router' => array(
'routes' => array(
'home' => array(
'type' => 'hostname',
'options' => array(
'route' => 'www.foobar.com',
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'home-controller',
'action' => 'index'
)
)
),
'api' => array(
'type' => 'hostname',
'options' => array(
'route' => 'api.foobar.com',
'constraints' => array(
'subdomain' => 'api',
),
'defaults' => array(
'__NAMESPACE__' => 'Api\Controller',
'controller' => 'api-controller',
'action' => 'index'
)
)
),
'admin' => array(
'type' => 'hostname',
'options' => array(
'route' => 'admin.foobar.com',
'constraints' => array(
'subdomain' => 'admin',
),
'defaults' => array(
'__NAMESPACE__' => 'Admin\Controller',
'controller' => 'admin-controller',
'action' => 'index'
)
),
'may_terminate' => true,
'child_routes' => array(
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',
'constraints' => array(
'__NAMESPACE__' => 'Admin\Controller',
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
),
'defaults' => array()
)
)
)
)
)
)
);
有趣的是,目前使用此配置,我在我的开发环境和路由转储中遇到 api.foobar.com、www.foobar.com 和 admin.foobar.com 的 404 页面未找到错误,如下所示:
object(Zend\Mvc\Router\PriorityList)[214]
protected 'routes' =>
array (size=3)
'home' =>
array (size=3)
'route' =>
object(Zend\Mvc\Router\Http\Hostname)[216]
...
'priority' => int 0
'serial' => int 0
'admin' =>
array (size=3)
'route' =>
object(Zend\Mvc\Router\Http\Part)[218]
...
'priority' => int 0
'serial' => int 1
...
'priority' => int 0
'serial' => int 2
protected 'serial' => int 3
protected 'count' => int 3
protected 'sorted' => boolean false
我在 Application Module > Module.php > onBootstrap($e) 方法中得到了这个转储: $routes = $e->getApplication()->getServiceManager->get('router')->getRoutes();
问题:
- 这个配置有什么问题?
- 为什么我的顶级管理路由列为Zend\Mvc\Router\Http\Part?
- 对于这种情况,我应该将路由定义与每个模块自己的 module.config.php 文件分开吗?