Я беру курс по разработке основ Magento 2, и упражнение Admin Router / Controller кажется устаревшим. Маршрутизатор работает, а контроллер - нет, он всегда просто перенаправляет на домашнюю страницу администратора. Код для приложения маршрутизатора / code / Training / Test / etc / adminhtml / rout.xml :
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/framework/App/etc/routes.xsd">
<router id="admin">
<route id="test" frontName="test">
<module name="Training_Test" before="Magento_Backend" />
</route>
</router>
</config>
Код для приложения контроллера Admin / code / Training / Test / Controller / Adminhtml / Action / Index.php :
<?php
namespace Training\Test\Controller\Adminhtml\Action;
class Index extends \Magento\Backend\App\Action
{
public function execute()
{
die("test reached controller");
}
protected function _isAllowed() {
return true;
}
}
Когда я захожу на административный URL-адрес admin / test / action / index, он просто перенаправляет и ничего не происходит. Если я добавляю конструктор и использую xdebug, он показывает, что он достигает конструктора контроллера, но никогда не выполняет часть выполнения. Что мне не хватает?
Ответы:
Это происходит потому, что «секретный ключ» отсутствует, когда вы просто вводите URL вручную. Секретный ключ функция включена по умолчанию и может быть отключена здесь:
Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs
. Тогда вы должны быть в состоянии достичь своих действий.источник
В
router.xml
file (companyName/customModule/etc/adminhtml/router.xml
) Для меня решение состояло в том, чтобы идентификатор маршрута и frontName имели одно и то же значение. В вашем случае это будет:источник
<route id="Bmanager" frontName="bmanager">
на<route id="bmanager" frontName="bmanager">
и теперь я могу сделать основную работу контроллера , как описано тело вопроса. Еще не повезло с моими кастомными контроллерами. Изменить: На самом деле один из моих пользовательских контроллеров начал выдавать некоторые ошибки. Гораздо лучше, чем перенаправление без ошибок.Может быть, лучше использовать это свойство:
источник
При попытке получить доступ к модулям / функциям в бэкэнде (Adminhtml), Magento проверяет наличие секрета
Form Keys
, и если / когда кто-то пытается получить доступ к действию и не предоставляет FormKey (например, горячая ссылка на URL) и / или предоставляет неверный FormKey - Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) направит пользовательскую стартовую страницу Admin UIX пользователя (обычно это страница Dashboard)[Этот механизм служит «контрольной точкой безопасности» для предотвращения доступа пользователей к тем частям Бэкэнда, к которым у них нет доступа]
При доступе к опциям из меню Admin UIX - Magento автоматически добавит FormKey для вас.
Чтобы предотвратить проверку FormKey, у вас есть два варианта:
(а) Отключить проверку формы ключа
Навигация: Магазины -> Настройки: Конфигурация -> Дополнительно: Администратор -> Безопасность -> Настройка «Добавить секретный ключ к URL» в «Нет»
Очень важно помнить, что это отключит проверку секретного ключа и, следовательно, может сделать ваше приложение уязвимым.
(б) Отключите валидацию FormKey для вашего контроллера
Укажите действия, которые вы хотите исключить из проверки FormKey, в атрибуте «$ _publicActions» вашего Admin Controller.
protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];
Пример кода:
источник
Проблема перенаправления маршрутизации с включенным ключом безопасности заключается в URL-адресе действия, заданном в файле menu.xml в / etc / adminhtml /
Важным значением является параметр action в пункте меню. Обратите внимание, чтобы в параметре id было указано имя модуля, объявленного в routs.xml. В моем случае: "mycompany_mymodule"
источник
<input name="form_key" type="hidden" value="<?php echo $block->escapeHtml($block->getFormKey()) ?>" />
поможетно вы можете добавить кирпичик в vendor / magento / module-backend / App / AbstractAction.php
источник