Magento 2 CE:フロントコントローラーがルーターの一致反復の100に達しました問題


7

Magento 2 CEバージョン2.1.0を使用しています

ルーティングのためにhttp://inchoo.net/magento-2/routing-in-magento-2/を参照します

私のRouter.phpコントローラーコード

public function match(\Magento\Framework\App\RequestInterface $request) {

    $identifier = trim($request->getPathInfo(), '/');

    if (strpos($identifier, 'test') !== false) {
        $request->setModuleName('moduletest')->setControllerName('test')->setActionName('test');
    } else {
        //There is no match
        return;
    }

    return $this->actionFactory->create(
                    'Magento\Framework\App\Action\Forward', ['request' => $request]
    );
}

@ vendor \ magento \ framework \ App \ FrontController.phpが見つかりました

public function dispatch(RequestInterface $request)
{
    \Magento\Framework\Profiler::start('routers_match');
    $routingCycleCounter = 0;
    $result = null;
    while (!$request->isDispatched() && $routingCycleCounter++ < 100) {
        /** @var \Magento\Framework\App\RouterInterface $router */
        foreach ($this->_routerList as $router) {
            try {
                $actionInstance = $router->match($request);
                if ($actionInstance) {
                    $request->setDispatched(true);
                    $this->response->setNoCacheHeaders();
                    if ($actionInstance instanceof \Magento\Framework\App\Action\AbstractAction) {
                        $result = $actionInstance->dispatch($request);
                    } else {
                        $result = $actionInstance->execute();
                    }
                    break;
                }
            } catch (\Magento\Framework\Exception\NotFoundException $e) {
                $request->initForward();
                $request->setActionName('noroute');
                $request->setDispatched(false);
                break;
            }
        }
    }
    \Magento\Framework\Profiler::stop('routers_match');
    if ($routingCycleCounter > 100) {
        throw new \LogicException('Front controller reached 100 router match iterations');
    }
    return $result;
}

http://inchoo.net/magento-2/routing-in-magento-2/ gitHubコードをダウンロードしてインストールし、正常に動作しました。しかし、それは私のカスタムモジュールでは機能しません。

私が入力したときのhttp:// localhost /をmagento2 /のmymodule /たExampleRouterそれはルータInChooコントローラに鉱山ではない行きます。

この問題を解決するには?

回答:


17

あなたは無限ループを作成しました:

  1. 「test」で始まるURLをリクエストした
  2. ルーターがモジュール、コントローラー、アクションを「moduletest」、「test」、「test」に設定している
  3. このリクエストを使用して転送します(URLはまだ「test」で始まっています)
  4. (1)に進みます。

    インチーの記事はまたそれを説明しています:

    転送とは、現在のルーターのループを中断し、ループを再開することを意味します

したがって、転送を使用する場合は、転送先のリクエストがルーターによって再度照合されないようにしてください。

あなたのケースの可能な解決策は、リクエストがすでに変更されているかどうかを確認することです:

public function match(\Magento\Framework\App\RequestInterface $request) {
    if ($request->getModuleName() === 'moduletest') {
        return;
    }

    ...

$ request-> getModuleName()BLANKを取得しています。いかなる種類のモジュール名も返しません。localhost / magento2 / mymodule / frontend-testを使用してアクセスしています。fontend-testは、CMSページURLのようなURL識別子です
Ankit Shah

@AnkitShahこれはxmlのsortOrderの問題が原因です。役立つと思われる場合は、次のいずれかの答えを受け入れる必要があります。
Himanshu

7

コードが完璧で、それでもエラーが発生する場合は、sortOrderでルータープラグインクラスを確認する必要がありますdi.xml

magentoの公式の発言として:https : //devdocs.magento.com/guides/v2.3/extension-dev-guide/routing.html

フロントエンドの場合: ここに画像の説明を入力してください

管理者の場合: ここに画像の説明を入力してください

ソート順は、magentoの標準ルーターとデフォルトのルーターのソート順の間にある必要があります。


6

答えるのが遅いのは分かっていますが、他の人に役立つでしょう。

magento 2.1.10では、標準ルーターのsortOrderが30に変更され、カスタムルーター(sortOrderは22)がリクエストを無限ループに転送するようになりました。カスタムルーターの順序を30以上に変更すると、問題が解決します。


はい、動作しています。デバッグには3/4時間を費やしていますが、変更できるのは並べ替え順序のみです。どのようにmagentoはこれを行うことができますか?:(
Himanshu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.