Magento 2 CE: Front-Controller hat 100 Router-Match-Iterationen erreicht. Problem


7

Ich verwende Magento 2 CE Version 2.1.0

Verweis auf http://inchoo.net/magento-2/routing-in-magento-2/ für das Routing.

Mein Router.phpController-Code

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]
    );
}

Ich habe @ vendor \ magento \ framework \ App \ FrontController.php gefunden

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;
}

Ich habe http://inchoo.net/magento-2/routing-in-magento-2/ gitHub Code heruntergeladen und installiert und funktioniert einwandfrei. Aber es funktioniert nicht für mein benutzerdefiniertes Modul.

Wenn ich http: // localhost / magento2 / mymodule / examplerouter eingebe , geht es zum InChoo Controller Router, nicht zu meinem.

Wie kann man dieses Problem lösen?

Antworten:


17

Sie haben eine Endlosschleife erstellt:

  1. Sie fordern eine URL an, die mit "test" beginnt.
  2. Ihr Router setzt Modul, Controller und Aktion auf "Moduletest", "Test" und "Test".
  3. Sie leiten diese Anfrage weiter (die URL beginnt immer noch mit "test")
  4. Gehe zu (1).

    Der Inchoo-Artikel erklärt auch Folgendes:

    Weiterleitung bedeutet, dass die aktuelle Router-Schleife unterbrochen und die Schleife erneut gestartet wird

Wenn Sie die Weiterleitung verwenden, stellen Sie sicher, dass die Anforderung, an die Sie weiterleiten, vom Router nicht erneut übereinstimmt.

Eine mögliche Lösung für Ihren Fall besteht darin, zu überprüfen, ob die Anforderung bereits geändert wurde:

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

    ...

Ich erhalte $ request-> getModuleName () BLANK. Es wird kein Modulname zurückgegeben. Ich greife mit localhost / magento2 / mymodule / frontend-test zu, wobei fontend-test URL Identifier wie CMS-Seiten-URL ist
Ankit Shah

@AnkitShah Es liegt an einem sortOrder-Problem in XML. Jetzt müssen Sie die Antwort wie folgt akzeptieren, wenn Sie dies hilfreich fanden.
Himanshu


6

Ich weiß, dass es spät ist zu antworten, aber es wäre hilfreich für andere.

In Magento 2.1.10 wurde der Standard-Router sortOrder in 30 geändert, sodass der benutzerdefinierte Router (sortOrder ist 22) eine Endlosschleife für die Weiterleitungsanforderung bereitstellt. Ändern Sie die benutzerdefinierte Router-Reihenfolge> 30, um das Problem zu beheben.


Ja, es funktioniert. Wir haben 3/4 Stunden damit verbracht, Fehler zu beheben, aber nur die Sortierreihenfolge zu ändern, funktioniert. Wie kann Magento das?! :(
Himanshu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.