7

Magentoのルーティングロジックに問題があることを発見しました。誰かがこれを確認できるかどうかを確認したいと思います。

Magentoは、ルーターadmin、standard、defaultをスタックし、一度に1つずつ処理します。Magentoは、URLに基​​づいて現在のモジュール名を取得します(を参照Mage_Core_Controller_Varien_Router_Standard::match())して、Magento構成のfrontNameとの一致に基づいて、モジュールをこのルーターで処理する必要があるかどうかを確認します。一致する場合はルーティングします。一致しない場合はルーティングします。次のルーターに進みます。

構成の抜粋:

    <管理者>
        <ルーター>
            <myroute>
                <use> admin </ use>
                <args>
                    <module> MyNamespace_MyModule </ module>
                    <frontName> myroute </ frontName>
                </ args>
            </ myroute>
        </ルーター>
    </ admin>
    <フロントエンド>
        <ルーター>
            <myroute>
                <use> admin </ use>
                <args>
                    <module> MyNamespace_MyModule </ module>
                    <frontName> myroute </ frontName>
                </ args>
            </ myroute>
        </ルーター>
    </フロントエンド>
    

つまり、フロントエンドルーターに管理ルーターと同じ名前を使用すると、フロントエンドページであっても、管理ルーターが常に最初に照合されます。フロントエンドページは、adminを使用して、adminページであるかのようにルーティングされるようにbase_urlなります。これは、ストアのURLとは異なる場合があり、リダイレクトが壊れます。

この問題は、管理ベースURLがフロントエンドベースURLと同じであるMagentoインスタンスでは明らかではないことに注意してください。

ここでルーターロジックの評価が正しいことを誰かが確認できますか?

4

3 に答える 3

4

特に、Varien/Router/Standard.php も参照してください。

/**
 * checking if this admin if yes then we don't use this router
 *
 * @return bool
 */
protected function _beforeModuleMatch()
{
    if (Mage::app()->getStore()->isAdmin()) {
        return false;
    }
    return true;
}

そして、これはメソッド内で呼び出されるmatch(Zend_Controller_Request_Http $request)だけでなく、時々返さcollectRoutes($configArea, $useRouterName)れるだけでなく、フロントエンドリクエストに対しても返されます。 この仮定は、magentoがこの同じクラスでプライベート配列を構築およびスタックする方法にすべて依存するため、正しいように聞こえます: .$useRouterNameadminstandard_routes_modulesMage_Core_Controller_Varien_Router_Standard

この場合、<use>ノードstandardをフロントエンドおよびadmin管理者として指定するか、ノードのコントローラー アクションを書き直す必要があると思い<global>ます。

あなたの最善の策は、読み直すことだと思います:

および/またはX-debugを使用してロジックをステップ実行します。

Alan Storm でさえ、彼の記事で、フロントエンドとバックエンドに使用される同じルーターが同じであってはならないことを書いています。

したがって、このメソッドは、何らかの理由でストア モデル オブジェクトが管理モードにあると判断した場合に、標準ルーター オブジェクトが確実に停止するようにするためにあるようです。標準/管理ルーターの関係と同様に、ストア オブジェクトは、Magento 開発プロセスの特定の部分が最初にフロントエンド アプリケーションに焦点を当て、その後管理コンソールに追加して変更をバックポートする必要があることを示すもう 1 つの要素です。 .

store オブジェクトは、実際にはフロントエンド/カート アプリケーションにのみ適用されるモデルです。ただし、Magento の多くのコードはストア オブジェクトが存在することを前提としているため、管理コンソール アプリケーションで使用できるようにする必要があります。これにより、ルーター レベルで問題が発生し、このようなチェックが行われます。多くの抽象化レイヤー、クラス/モジュール間の定義されていないコントラクト、およびテストの欠如によって作成されるリファクタリングの恐怖は、常にこの種の状況につながります.

于 2012-05-07T22:42:06.380 に答える
3

これは Magento のバグではありませんが、モジュールを作成したり、サード パーティのコードを操作したりする際には注意が必要です。ここで問題と解決策を明確にしました。基本的に、新しい管理ルートを作成するのではなく、既存の adminhtml ルートを常に使用する必要があります。これにより、管理者の URL が一貫し、競合が回避されます。Magento ルーティングの理解を深めるために、Alan と Jared に感謝します。

于 2012-05-17T04:15:56.710 に答える