2012-05-07 3 views
6

Magentoルーティングロジックに関する問題を発見しました。誰でもこれを確認できるかどうか確認したいと思います。フロントエンドと管理ルータに同じMagentoルートフロントネームを使用

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

コンフィグ抜粋:。

 
    <admin> 
     <routers> 
      <myroute> 
       <use>admin</use> 
       <args> 
        <module>MyNamespace_MyModule</module> 
        <frontName>myroute</frontName> 
       </args> 
      </myroute> 
     </routers> 
    </admin> 
    <frontend> 
     <routers> 
      <myroute> 
       <use>admin</use> 
       <args> 
        <module>MyNamespace_MyModule</module> 
        <frontName>myroute</frontName> 
       </args> 
      </myroute> 
     </routers> 
    </frontend> 

これは、あなたの管理ルーターとしてあなたのフロントエンドルータに同じ名前を使用している場合、管理ルータは常に偶数で、最初に一致されることを意味しますフロントエンドページは管理者ページの場合はbase_urlという管理者ページを使用している場合はそのまま転送されます。店舗のURLとは異なる場合があります。

adminのベースURLがフロントエンドのベースURLと同じMagentoのインスタンスでは、この問題は発生しません。

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

+2

私はあなたの特定の問題について話すことができません。私は完全にそれに従っているかどうかはわかりませんが、Magentoのルーティングは、1のアイデアを取り巻くようになり始めました。 2. adminモジュールにfrontname "admin"を使用し、 "modules"タグを使用してコントローラをコントローラに追加し、管理ルータが探します。あなたがこのパターンから離れると、あなたは痛みを感じます。 –

+0

サードパーティのモジュールでこの問題が見つかりました。フロントエンドと管理領域に同じフロントネームを使用しました。これはうまく動作すると思われますが、違いは管理者ストアをロードするURLの "admin"文字列です。問題はフロントエンドページが管理ルータによってロードされ、フロントエンドのベースURLとは異なる管理ベースURLを使用することになりました。両方のルーターは、この名前の競合を除いて、設定に基づいて期待どおりに動作するように見えます。 – kirkmadera

+1

これをさらに調べると、モジュールは私が思っていたように機能していないことが分かります。それは完全に管理者の外に自分のfrontnameを設定していた。モジュールのコントローラがMage_Adminhtml_Controller_Actionを拡張し、preDispatchが設計を管理設計に強制したため、管理者は同じように見えました。すべての管理者コントローラーは、 "モジュール"ノードを使用して "管理者"のフロントネームを通過して上書きする必要があります。このサードパーティのモジュールは正しく設定されていません。それでも、Magento – kirkmadera

答えて

3

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

+1

キャプテン、あなたのブログのURLが変更されました、今、[こちら](http://blog.kirkmadera.com/magento-routing-using-the-same-frontname-for-admin-and-frontend-routes/)です。 –

4

あなたは特に、同様Varien /ルータ/ 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)内で呼び出されるだけでなく、$useRouterNameとしてcollectRoutes($configArea, $useRouterName)は時々もadminを返し、意志ますフロントエンド要求の場合はstandardを返します。仮定は、まったく同じようにmagentoが_routes_modulesプライベートアレイをどのようにビルドして積み重ねるかによって決まります:Mage_Core_Controller_Varien_Router_Standard

私はこのケースでは、あなたが管理者のためのフロントエンド用standardadminとして<use>ノードを指定、または<global>ノード内のコントローラのアクションを書き換えたいと考えています。

私はあなたの最善の策は終わっ読み取ることがあると思う:

ロジックを通して

および/またはステップをX-debugと。

でも、彼の記事のAlan Stormは、同じルーターがフロントエンドとバックエンドにどのように使用されるべきかを書いています。

したがって、何らかの理由で店舗モデルオブジェクトがその管理モードで考えると、この方法がスタンダードルータオブジェクトを保証するためにここにあるように見えます。標準/管理者のルータ関係と同様に、ストアオブジェクトは、フロントエンドアプリケーションに集中しているMagento開発プロセスの特定の部分を指し示し、後で管理コンソールをタックし、変更をバックポートする必要がある。

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

+0

から明らかな動作良い説明。私はこの問題を、人気のある「EM Quickshop」モジュールを使用して調べました。このサイトの管理セクションは別のドメインにあり、HTTPSへのリダイレクトの一環として、モジュールは管理ドメインにリダイレクトされ、リクエストはnorouteに送られました。同じルート名を使うのは間違いです。 –

1

これに2セントを投げるだけです。私は確かに今夜この問題に気づいた!私は、カスタムモジュールを構築することだし、私のconfig.xmlのルータがそうのように定義されています。

<admin> 
    <routers> 
     <namespace_module> 
      <use>admin</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</admin> 
<frontend> 
    <routers> 
     <namespace_module> 
      <use>standard</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</frontend> 

バックエンドルータがうまく働いている間、私はフロントエンドに404エラーを得ました。フロントエンドの名前を変更しました:

<admin> 
    <routers> 
     <namespace_module> 
      <use>admin</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</admin> 
<frontend> 
    <routers> 
     <namespace_module> 
      <use>standard</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module_front</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</frontend> 

私は推測するユニークな名前を使用すると意味があります!

関連する問題