Magento 2 CE: Bộ điều khiển phía trước đạt 100 lần lặp bộ định tuyến khớp


7

Tôi đang sử dụng Magento 2 CE Phiên bản 2.1.0

Tham khảo http://inchoo.net/magento-2/routing-in-magento-2/ để định tuyến.

Router.phpMã điều khiển của tôi

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

Tôi tìm thấy @ nhà cung cấp \ magento \ framework \ App \ FrontContoder.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;
}

Tôi đã tải xuống http://inchoo.net/magento-2/routing-in-magento-2/ mã gitHub & cài đặt & hoạt động tốt. Nhưng nó không hoạt động cho mô-đun tùy chỉnh của tôi.

Khi tôi gõ http: // localhost / magento2 / mymodule / testsplerouter, nó đi đến bộ định tuyến InChoo Controller không phải của tôi.

Làm thế nào để giải quyết vấn đề này?

Câu trả lời:


17

Bạn đã tạo một vòng lặp vô hạn:

  1. bạn yêu cầu một URL bắt đầu bằng "test"
  2. bộ định tuyến của bạn đặt mô-đun, bộ điều khiển và hành động thành "moduletest", "test" và "test"
  3. bạn chuyển tiếp, sử dụng yêu cầu này (URL vẫn đang bắt đầu bằng "kiểm tra")
  4. Chuyển đến (1).

    Bài báo inchoo cũng giải thích rằng:

    Chuyển tiếp có nghĩa là nó sẽ phá vỡ vòng lặp bộ định tuyến hiện tại và bắt đầu lại vòng lặp

Vì vậy, nếu bạn sử dụng chuyển tiếp, hãy đảm bảo rằng yêu cầu bạn chuyển tiếp không được khớp với bộ định tuyến một lần nữa.

Một giải pháp khả thi cho trường hợp của bạn là kiểm tra xem yêu cầu đã được sửa đổi chưa:

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

    ...

Tôi đang nhận $ request-> getModuleName () BLANK. Nó không trả về bất kỳ loại tên mô-đun. Tôi đang truy cập bằng localhost / magento2 / mymodule / frontend-test trong đó kiểm tra fontend là Định danh URL như URL Trang CMS
Ankit Shah

@AnkitShah đó là do sự cố sắp xếp trong xml, bây giờ bạn phải chấp nhận câu trả lời bất kỳ câu hỏi nào sau đây nếu bạn thấy hữu ích.
Himanshu

7

Nếu mã của bạn là hoàn hảo và bạn vẫn gặp lỗi, thì bạn phải kiểm tra sortOrderlớp plugin của bộ định tuyến di.xml.

Như chính thức của magento nói: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/routing.html

Đối với mặt trận: nhập mô tả hình ảnh ở đây

Dành cho quản trị viên: nhập mô tả hình ảnh ở đây

Thứ tự sắp xếp của bạn phải ở giữa bộ định tuyến chuẩn magento và thứ tự sắp xếp bộ định tuyến mặc định.


6

Tôi biết đã muộn để trả lời nhưng nó sẽ hữu ích cho những người khác.

Trong magento 2.1.10, bộ sắp xếp bộ định tuyến tiêu chuẩn đã được thay đổi thành 30, làm cho bộ định tuyến tùy chỉnh (mà sortOrder là 22) chuyển tiếp vòng lặp yêu cầu vô hạn. Thay đổi thứ tự bộ định tuyến tùy chỉnh> 30 giải quyết vấn đề.


Vâng, nó đang hoạt động. chúng tôi đã dành 3/4 giờ để gỡ lỗi trong đó, nhưng chỉ thay đổi thứ tự sắp xếp hoạt động. Làm thế nào magento có thể làm điều này?! :(
Himanshu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.