2

私は今日、同じモジュールになくても、2 つのコントローラーが同じ名前を持っている場合、zf2 があまり好きではないことを発見しました。ただし、localhost/users/types と localhost/messages/types を呼び出せるようにする必要があります

今のところ、私の 2 つのコントローラーは同じ名前です。また、モジュールの名前が何であれ、localhost/nonexistingmodule/types oO であっても、常にメッセージ/タイプの結果が得られることも発見しました

ここに私のmodule.config.phpがどのように見えるかがあります:

return array(
    'controllers' => array(
        'invokales' => array(
            'messages' => 'Messages\Controller\MessagesController,
            'messages' => 'Messages\Controller\TypesController,
        ),
    ),
    'di' => array(
        'instance' => array(
            'alias' = array(),
        ),
    ),
    'router' => array(
        'routes => array(
            'restful' => array(
                'type' => 'Zend\Mvc\Router\Http\Segment'
                'options' => array(
                    'route' => '/Messages/:controller[.:formatter][/:id],
                    'constraints' => array(
                        'module' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'formater' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id' => '[a-zA-Z0-9_-]*',
                    ),
                    'defaults' => array(
                        'module' => 'Messages',
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array( ... ),
);

制約で 'module' => 'Messages' を設定しようとしましたが (:p はわかりません)、404 エラーが発生しました。Tasks モジュールの module.config.php は同じですが、タスク用です。私はもともとエイリアスを持っていましたが、どこかでこれがあまり推奨されていないことを読んだ後、それらを削除しました。

もう1つ、これはREST APIです。すべてのコントローラーはAbstractRestfulControllerを拡張します(これが重要な場合)

私の2つのURLを機能させる方法を知っている人はいますか?

ありがとう :)

4

2 に答える 2

2

呼び出し可能オブジェクトやサービスなどのエイリアスは一意である必要があります。それらが一意でない場合、モジュール自体がロードされる順序で別のモジュールによって上書きされる可能性があります。つまり、呼び出し可能オブジェクトまたはあらゆる種類のエイリアスを設定するときは、エイリアスが一意意味のあるものであることを確認してください。個人的には、コントローラーに次のような名前を付けます。

'invokables' => array(
    'mymodule-controller-controllername' => 'Mymodule\Controller\ControllernameController'
)

サービスまたはその他の種類のエイリアスと同じ

'services' => array(
    'mymodule-service-servicename' => 'Mymodule\Service\Classname'
)

ドキュメントは、次のような名前空間スタイルの構文に従います...

'invokables' => array(
    'Mymodule\Controller\Controllername' => 'Mymodule\Controller\ControllernameController'
)

...個人的には、名前空間にあまりにも似ていて、それが単なるエイリアス/キーであることを自動的に暗示していないため、完全に混乱しています。

今、あなたのコメント - 質問がわかりません。1 つのルート2 つの異なるコントローラーに一致させたいですか? それは不可能であり、無意味です。

Answer ルーティング構成で更新

ルーティング構成に関しては、いくつかの方法があります。個人的には、文字どおりのルートを構築することに多大な努力を払っています。それらは最も高速ですが、多くの手動の注意も必要とするからです。あるいは、それらへの魔法をもう少し阻害するセグメント ルートがあります。文字通りのアプローチについて説明します。

モジュール メッセージ

'controllers' => array(
    'invokables' => array(
        'messages-controller-index' => 'Messages\Controller\IndexController',
    )
),
'router' => array(
    'routes' => array(
        'messages' => array(
            'type' => 'literal',
            'options' => array(
                'route' => '/messages',
                'defaults' => array(
                    'controller' => 'messages-controller-index',
                    'action'     => 'index'
                )
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'types' => array(
                    'type' => 'literal',
                    'options' => array(
                        'route' => '/types',
                        'defaults' => array(
                            'action' => 'types'
                        )
                    )
                )
            )
        )
    )
)

モジュールのタスク

'controllers' => array(
    'invokables' => array(
        'tasks-controller-index' => 'Tasks\Controller\IndexController',
    )
),
'router' => array(
    'routes' => array(
        'tasks' => array(
            'type' => 'literal',
            'options' => array(
                'route' => '/tasks',
                'defaults' => array(
                    'controller' => 'tasks-controller-index',
                    'action'     => 'index'
                )
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'types' => array(
                    'type' => 'literal',
                    'options' => array(
                        'route' => '/types',
                        'defaults' => array(
                            'action' => 'types'
                        )
                    )
                )
            )
        )
    )
)

だから何が起こっているのですか:

  • if route is if route /messagesto controller-alias messages-controller-indexwithindexAction()
  • ルート/messages/typesの場合、コントローラーエイリアスにとどまりますmessages-controller-indexが、に移動しますtypesAction()
  • if route is if route /tasksto controller-alias tasks-controller-indexwithindexAction()
  • ルート/tasks/typesの場合、コントローラーエイリアスにとどまりますtasks-controller-indexが、に移動しますtypesAction()

コントローラーのエイリアスとその背後にある意味を明らかに変更できます。/messages/types/1タイプのタイプルートに子ルートを構築し、segment制約が数値でなければならない [:id] パラメータをチェックするように、ルートの ID を追加したい場合:) 公式の ZF2 を確認してください詳細についてはマニュアル、私は今怠け者です :P

于 2012-11-27T14:25:08.920 に答える
1

tl;dr:__NAMESPACE__ルート定義にデフォルトがあることを確認してから、すべてのサービス名にそのプレフィックスが付いていることを確認してください。通常、値はモジュールの名前空間と一致します。

より長い説明については:

率直に言って、コントローラーにマップするルートに動的セグメントを配置するのは本当に悪い習慣です (:controllerあなたの例では)。その理由は、誰かがこれを発見した場合、コントローラー インジェクションを実行し、この特定のルートによってルーティングされるべきではないコントローラーを要求できるためです。

さらに、特に__NAMESPACE__ルート構成でデフォルトを省略した場合、この慣行は簡単に衝突につながる可能性があります。これは、質問に基づいてすでに発見されています。

于 2013-03-22T20:27:36.947 に答える