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?

Ankit Shah
quelle

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

    ...
Fabian Schmengler
quelle
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
7

Wenn Ihr Code perfekt ist und Sie immer noch eine Fehlermeldung erhalten, müssen Sie Ihre sortOrderRouter-Plugin-Klasse einchecken di.xml.

Wie Magento-Beamte sagen: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/routing.html

Für das Frontend: Geben Sie hier die Bildbeschreibung ein

Für den Administrator: Geben Sie hier die Bildbeschreibung ein

Ihre Sortierreihenfolge sollte zwischen der Magento-Standardrouter- und der Standard-Routersortierreihenfolge liegen.

Himanshu
quelle
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.

Tuan Nguyen
quelle
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