0

我正在开发一个 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();

问题:

  1. 这个配置有什么问题?
  2. 为什么我的顶级管理路由列为Zend\Mvc\Router\Http\Part
  3. 对于这种情况,我应该将路由定义与每个模块自己的 module.config.php 文件分开吗?
4

1 回答 1

1

---这个配置有什么问题

它在我的测试中运行良好,您可以参考底部的代码。所以我建议你应该检查:

  1. 确保控制器/动作文件存在
  2. 确保 vhosts 已在 apache/nginx/ 中配置,无论您使用的是什么 http 主机。

---为什么我的顶级管理路由列为 Zend\Mvc\Router\Http\Part?

实际上,您的 'admin' 路由配置了子路由,zf2 会将其视为 'part' 路由,请参考Zend\Mvc\Router\Http\Part 示例

---对于这种情况,我应该将路由定义与每个模块自己的 module.config.php 文件分开吗?

不,实际上您可以根据需要将所有模块路由放在一个模块的配置文件中。

这是我的代码:返回数组

(
    'router' => array(
        'routes' => array(
                /*
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),
            */
            'home1' => array(
                    'type' => 'hostname',
                    'options' => array(
                            'route' => 'zfskeleton.com',
                            'defaults' => array(
                                    '__NAMESPACE__' => 'Application\Controller',
                                    'controller' => 'Index',
                                    'action' => 'index'
                            )
                    )
            ),
            'home' => array(
                    'type' => 'hostname',
                    'options' => array(
                            'route' => 'www.zfskeleton.com',
                            'defaults' => array(
                                    '__NAMESPACE__' => 'Application\Controller',
                                    'controller' => 'Index',
                                    'action' => 'index'
                            )
                    )
            ),
            'api' => array(
                    'type' => 'hostname',
                    'options' => array(
                            'route' => 'api.zfskeleton.com',
                            'constraints' => array(
                                    'subdomain' => 'api',
                            ),
                            'defaults' => array(
                                    '__NAMESPACE__' => 'Album\Controller',
                                    'controller' => 'Album',
                                    'action' => 'api'
                            )
                    )
            ),
            'admin' => array(
                    'type' => 'hostname',
                    'options' => array(
                            'route' => 'admin.zfskeleton.com',
                            'constraints' => array(
                                    'subdomain' => 'admin',
                            ),
                            'defaults' => array(
                                    '__NAMESPACE__' => 'Album\Controller',
                                    'controller' => 'Album',
                                    'action' => 'admin'
                            )
                    ),
                    '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()
                                    )
                            )
                    )
            ),
            // The following is a route to simplify getting started creating
            // new controllers and actions without needing to create a new
            // module. Simply drop new controllers in, and you can access them
            // using the path /application/:controller/:action
            'application' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/application',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller'    => 'Index',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    '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(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
于 2013-10-21T03:23:39.110 回答