3

私たちは zf2 を使い始めたばかりなので、他の誰かが Thumbnail サーバー モジュールを作成し、次に Lookup サーバー モジュールを追加しました。これらのサーバーは両方とも RESTful api であるため、これらのサーバーを呼び出します。最初は連携して動作しているように見えましたが、誰かが私のモジュールに変更を加えたため、モジュールのapplication.config.phpリストから Lookup を削除しない限り、Thumbnail サーバーが動作しなくなりました。ルックアップ サーバーは関係なく動作します。コードを調べてみると、Lookup に加えられた変更が Thumbnail にどのように影響するかわかりません。私が得ているエラーは次のようになります。

<h1>A 404 error occurred</h1>
<h2>Page not found.</h2>
<p>The requested controller was unable to dispatch the request.</p>
<dl>
<dt>Controller:</dt>
<dd>Lookup\Controller\Lookup</dd>
</dl>

application.config.php外観は次のとおりです。

<?php
return array(
    'modules' => array(
        'Application',
        'SanRestful',
        'Album',
        'AlbumRest',   
        'Thumbnail',         
        'Lookup',
        'AP_XmlStrategy',
    ),
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            'config/autoload/{,*.}{global,local}.php',
            'config/autoload/{,*.}' . (getenv('APPLICATION_ENV') ?: 'production') . '.php',
        ),
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),
);

ご覧のとおり、最初の Album モジュールと、他にもいくつかの実験的なモジュールがあります。私の Lookup モジュールは、Allessandro Pietrobelli による優れた AP_XmlStrategy モジュールを使用しています。

以下はサムネイルmodule.config.phpです。「id」と呼ばれる引数がないため、おそらく使用されていない制約がありますが、それで混乱することはないはずです。

<?php
return array(
    'controllers' => array(
        'invokables' => array(
            'Thumbnail\Controller\Thumbnail' => 'Thumbnail\Controller\ThumbnailController',
        ),
    ),

    // The following section is new and should be added to your file
    'router' => array(
        'routes' => array(
            'thumbnail' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/thumbnail[/:action][/:output]',
                    'constraints' => array(
                        'id'     => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Thumbnail\Controller\Thumbnail',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'thumbnail' => __DIR__ . '/../view',
        ),
    ),
);

そして、module.config.php識別子が難読化された Lookup :

<?php
return array(
    'db' => array(
        'driver'         => 'Pdo',
        'dsn'            => 'pgsql:dbname=<dbname>;host=<host>;port=<port>',
        'username'       => '<username>',
        'password'       => '<password>',
        ),
    'service_manager' => array(
        'factories' => array(
            'Zend\Db\Adapter\Adapter'
                    => 'Zend\Db\Adapter\AdapterServiceFactory',
        ),
        'aliases' => array(
            'db' => 'Zend\Db\Adapter\Adapter',
        ),
    ),
    'controllers' => array(
        'invokables' => array(
            'Lookup\Controller\Lookup' => 'Lookup\Controller\LookupController',
        ),
    ),
    // The following section is new and should be added to your file
    'router' => array(
        'routes' => array(
            'lookup' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '[/:action][/:version][/:resource][/:code][/:resource_xref]',
                    'constraints' => array(
                        'action'         => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'version'        => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'resource'       => '[a-zA-Z][a-zA-Z0-9_-|\.]*',
                        'code'           => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'resource_xref'  => '[a-zA-Z][a-zA-Z0-9_-|\.]*',
                    ),
                    'defaults' => array(
                        'controller' => 'Lookup\Controller\Lookup',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array(
        'template_path_stack' => array(
            'lookup' => __DIR__ . '/../view',
        ),
        'strategies' => array(
            'ViewJsonStrategy',
            'ViewXmlStrategy',
        ),
    ),
);

私が見逃している明らかな間違いはありますか?

4

1 に答える 1

5

リクエストは複数のルートで照合できます。例: URL /foo は、リテラル route/fooとroute によって一致させることができます[/:action]。2 つのルートを区別するには、それらを構成する順序が重要です。

どうなるかというと、ルートはLIFOの順序で照合されるため、最後のルートが最も明示的でなければなりません。「/foo」の例では、この構成はリテラルと一致します。

'router' => array(
    'routes' => array(
        'test1' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '[/:action]',
                'defaults' => array(
                    //
                ),
            ),
        ),
        'test2' => array(
            'type'    => 'literal',
            'options' => array(
                'route'    => '/foo',
                'defaults' => array(
                    //
                ),
            ),
        ),
    ),
),

ただし、以下の構成では、リテラルはに一致する可能性があるため、決して一致しません。[/:action]/foo

'router' => array(
    'routes' => array(
        'test2' => array(
            'type'    => 'literal',
            'options' => array(
                'route'    => '/foo',
                'defaults' => array(
                    //
                ),
            ),
        ),
        'test1' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '[/:action]',
                'defaults' => array(
                    //
                ),
            ),
        ),
    ),
),

次に、2 つのモジュールを見てみましょう。最初の (サムネイル) には route があり/thumbnail[/:action][/:output]ます。リテラル部分で始まります。次に、2 番目のモジュール (Lookup) には route があり[/:action][/:version][/:resource][/:code][/:resource_xref]ます。

ここで LIFO オーダーに戻ると、 で始まるすべてのルート/thumbnailが既にルックアップ ルートに一致します。

解決

2 つのオプションがあります。まず、モジュールの順序を入れ替えます。モジュール間に相互依存関係がある場合、これは常に重要な順序です。Lookup を最初にロードしてから Thumnnail をロードするため、サムネイル ルートは後で構成に配置されます。したがって、最初に一致します。したがって、アプリは再び機能します。

次に、2番目の解決策があります(そして、私見では、より良いです)。ルックアップには「それらすべてを支配する 1 つのルート」がありますが、これはあまり良い方法ではありません。何がうまくいかなかったのか分からず、今とまったく同じようにトラブルに巻き込まれる可能性があります。したがって、ルートで可能な限り指定してください。Lookup の最初の部分もリテラルにします (/lookup[/:action][/:version][/:resource][/:code][/:resource_xref]オプションではありませんか?)。または、パラメーターとしてアクションを削除し、それらをリテラルにします。

'router' => array(
    'routes' => array(
        'view' => array(
            'type'    => 'segemnt',
            'options' => array(
                'route'    => '/view[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'view',
                    //
                ),
            ),
        ),
        'create' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/create[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'create',
                    //
                ),
            ),
        ),
        'update' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/update[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'update',
                    //
                ),
            ),
        ),
        // And so on
    ),
),

このように、ルックアップ モジュールは固定の開始点を持ち、それらの最初の部分がリクエスト uri にある場合にのみ一致します。次に/thumbnail[/:action][/:output]、ルックアップ ルートから完全に切り離されます。

于 2013-04-27T11:16:11.590 に答える