Magento 2 CE: o controlador frontal atingiu 100 iterações de correspondência do roteador

7

Estou usando o Magento 2 CE versão 2.1.0

Tomando referência a http://inchoo.net/magento-2/routing-in-magento-2/ para roteamento.

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

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

Eu baixei o http://inchoo.net/magento-2/routing-in-magento-2/ código do gitHub e instalei e funcionando bem. Mas não está funcionando para o meu módulo personalizado.

Quando digito http: // localhost / magento2 / mymodule / examplerouter, ele vai para o roteador do InChoo Controller e não para o meu.

Como resolver este problema?

Ankit Shah
fonte

Respostas:

17

Você criou um loop infinito:

  1. você solicita um URL começando com "test"
  2. seu roteador define o módulo, controlador e ação para "moduletest", "test" e "test"
  3. você encaminhar usando esta solicitação (o URL ainda está começando com "teste")
  4. Vá para (1).

    O artigo inchoo também explica que:

    Encaminhamento significa que ele interromperá o loop dos roteadores atuais e iniciará o loop novamente

Portanto, se você usar o encaminhamento, verifique se a solicitação para a qual você encaminhar não é correspondida pelo roteador novamente.

Uma solução possível para o seu caso é verificar se a solicitação já foi modificada:

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

    ...
Fabian Schmengler
fonte
Estou recebendo $ request-> getModuleName () BLANK. Não está retornando nenhum tipo de nome de módulo. Eu estou acessando usando localhost / magento2 / mymodule / frontend-teste , onde fontend-teste é URL Identificador como CMS URL da página
Ankit Shah
@AnkitShah é devido ao problema sortOrder em xml, agora você deve aceitar a resposta de qualquer das seguintes opções, se achar útil.
precisa
7

Se o seu código for perfeito e você ainda receber um erro, verifique a sortOrderclasse de plug-in do roteador di.xml.

Como dizem os oficiais do magento: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/routing.html

Para front-end: insira a descrição da imagem aqui

Para administrador: insira a descrição da imagem aqui

Sua ordem de classificação deve estar entre o roteador padrão magento e a ordem de classificação padrão do roteador.

Himanshu
fonte
6

Sei que é tarde para responder, mas seria útil para outros.

No magento 2.1.10, o roteador padrão sortOrder foi alterado para 30, fazendo com que o roteador personalizado (cujo sortOrder tenha 22 anos) solicite o loop infinito. Alterar a ordem do roteador personalizado> 30 resolve o problema.

Tuan nguyen
fonte
Sim, está funcionando. gastamos 3/4 horas de depuração, mas alterar apenas a ordem de classificação funciona. como o magento pode fazer isso ?! :(
Himanshu