zf2

ZendFramework2 でのルーティング設定名にスラッシュ(/)を使ってはいけない

zf2で複数モジュールを使う際にあるモジュール設定(module.config.php)のルーティング設定名で以下のようにスラッシュを使っていました。

module.config.php
'router' => [
    'routes' => [
        '/api/test' => [
            'type'    => Segment::class,
            'options' => [
                'route'    => '/api/test[/:action]',
                'defaults' => [
                    'controller' => Controller\TestController::class,
                    'action'     => 'index',
                ],
            ],
        ],
    ],
],

ルーティング設定は動作していたのですが、あるControllerのリンク生成でPhpRenderer::url($name = null, array $params = array(), $options = array(), $reuseMatchedParams = false)を使ったらうまく動作しませんでした。
デバッグして確認したところurl()の第一引数からmodule.config.phpのルーティング設定名(/api/test)を検索するのだけど第一引数をexplode('/')してから検索していたので引っかからなかったようです。

Zend\Mvc\Router\Http\TreeRouteStack.php
public function assemble(array $params = array(), array $options = array())
{
    if (!isset($options['name'])) {
        throw new Exception\InvalidArgumentException('Missing "name" option');
    }

    $names = explode('/', $options['name'], 2);
    $route = $this->routes->get($names[0]);
    ・・・
}

ルーティング設定名にスラッシュを使えないことは分かったけど、モジュールによってコンテキストパスを分けたかったのでどんな命名規則にしようか悩んだところそれっぽい例があったのでハイフンでつなぐこととしました。

https://docs.zendframework.com/tutorials/in-depth-guide/understanding-routing/

module.config.php
'router' => [
    'routes' => [
        'api-test' => [ // ★修正箇所
            'type'    => Segment::class,
            'options' => [
                'route'    => '/api/test[/:action]',
                'defaults' => [
                    'controller' => Controller\TestController::class,
                    'action'     => 'index',
                ],
            ],
        ],
    ],
],