5

I'm trying to build a Magento 2 module that has an admin section.
But apparently I'm doing something wrong and when I click the admin menu link, I get redirected to the dashboard.
I've seen this question: Magento2 custom admin menu link is redirecting back to admin dashboard but that does not help much.
There is nothing in the logs, but for the moment, I don't care what the problem is.
What I need is a way to debug this.
Where is the actual redirect happening so I know where to start?

3

In app/bootstrap.php enable 'display_errors'

ini_set('display_errors', 1);

enable developer mode.

php bin/magento deploy:mode:set developer

Disable cache and check admin routes.xml file of your module frontname.

EDIT

It is redirect from Magento\Backend\App\AbstractAction

public function dispatch(\Magento\Framework\App\RequestInterface $request)
    {
        if (!$this->_processUrlKeys()) {
            return parent::dispatch($request);
        }

        if ($request->isDispatched() && $request->getActionName() !== 'denied' && !$this->_isAllowed()) {
            $this->_response->setStatusHeader(403, '1.1', 'Forbidden');
            if (!$this->_auth->isLoggedIn()) {
                return $this->_redirect('*/auth/login');
            }
            $this->_view->loadLayout(['default', 'adminhtml_denied'], true, true, false);
            $this->_view->renderLayout();
            $this->_request->setDispatched(true);
            return $this->_response;
        }

        if ($this->_isUrlChecked()) {
            $this->_actionFlag->set('', self::FLAG_IS_URLS_CHECKED, true);
        }

        $this->_processLocaleSettings();

        return parent::dispatch($request);
    }

In _processUrlKeys function redirecting from $this->_redirect($this->_backendUrl->getStartupPageUrl());

public function _processUrlKeys()
    {
        $_isValidFormKey = true;
        $_isValidSecretKey = true;
        $_keyErrorMsg = '';
        if ($this->_auth->isLoggedIn()) {
            if ($this->getRequest()->isPost()) {
                $_isValidFormKey = $this->_formKeyValidator->validate($this->getRequest());
                $_keyErrorMsg = __('Invalid Form Key. Please refresh the page.');
            } elseif ($this->_backendUrl->useSecretKey()) {
                $_isValidSecretKey = $this->_validateSecretKey();
                $_keyErrorMsg = __('You entered an invalid Secret Key. Please refresh the page.');
            }
        }
        if (!$_isValidFormKey || !$_isValidSecretKey) {
            $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true);
            $this->_actionFlag->set('', self::FLAG_NO_POST_DISPATCH, true);
            if ($this->getRequest()->getQuery('isAjax', false) || $this->getRequest()->getQuery('ajax', false)) {
                $this->getResponse()->representJson(
                    $this->_objectManager->get(
                        'Magento\Framework\Json\Helper\Data'
                    )->jsonEncode(
                        ['error' => true, 'message' => $_keyErrorMsg]
                    )
                );
            } else {
                $this->_redirect($this->_backendUrl->getStartupPageUrl());
            }
            return false;
        }
        return true;
    }

Above is possible area to check. Maybe it is helpful.

[EDIT BY OP]
The method _processUrlKeys in the code above is the one that does the redirect.
And here is why.
the backend router, when it does not find a controller action to map the url on, it maps it to the 404 page (Magento\Backend\Controller\Adminhtml\Noroute\Index class).
then comes the _processUrlKeys method that checks the url key.
And this url key depends on the controller name. Since the key is generated based on the url module/controller/action it will not match against the key for the noroute action and $_isValidSecretKey will be false hence the redirect.
The redirect does not happen if the Add Secret Key to URLs is off in the config panel. In this case you get a simple 404 page.

  • already have developer mode on and display errors. My routes.xml is not important in this case. It can even be missing. I need to know where exactly does the redirect happen. – Marius May 16 '16 at 20:02
  • Update answer please check it. – Prashant Valanda May 17 '16 at 6:19
  • 2
    Yep that's it. the _processUrlKeys method is the culprit. I will edit your answer and add a reason why this happens. – Marius May 17 '16 at 7:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.