私は zf2 プロジェクトに取り組んでおり、次のシナリオに従って、いくつかのモジュールをさまざまなサブドメインで動作するように構成する必要があります。
- API、バックエンド (管理者)、アプリケーション (コア モジュール)、ブログなどのさまざまなモジュールがあります。
- api.foobar.com、admin.foobar.com のような同じアプリケーション/パブリック ディレクトリを指す複数の仮想ホストがあります。
- 次のように、各モジュールで一意のコントローラー キー/エイリアスを使用しています。
...
'controllers' => array(
'invokables' => array(
'home-controller' => 'Application\Controller\IndexController',
),
),
したがって、ドメイン (ホスト名/routeMatch) に基づいてアプリケーションの動作を変更したいです。ホスト名が api.foobar.com のように見える場合、デフォルトのコントローラーは安静なコントローラーから派生する必要があります。呼び出さない、モバイル サイトの場合、ホーム コントローラーをモバイル コントローラーに変更する、別のレイアウトを使用するなど...
機能しない構成 (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 ファイルに分ける必要がありますか?