Magento 2自定义管理员操作已重定向到仪表板


18

我正在上Magento 2基础开发课程,并且管理路由器/控制器练习似乎已经过时了。路由器可以工作,但控制器不能工作,它始终只是重新路由到管理主页。路由器app / code / Training / Test / etc / adminhtml / routes.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>

管理员控制器app / 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;
    }
}

当我转到admin / test / action / index的管理URL时,它只是重定向而没有任何反应。如果我添加一个构造函数并使用xdebug,则表明它到达了控制器构造函数,但它从未执行过。我想念什么?


希望您的代码函数_isAllowed返回true。例如,“返回”指令是缺席
KAndy

@KAndy是的,虽然谢谢。编辑了我的问题以证明这一点。
凯文·查韦斯

Answers:


22

发生这种情况是因为,当您手动输入URL时,缺少“秘密密钥”。密钥功能默认情况下处于启用状态,可以在此处禁用:Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs。然后,您应该能够采取行动。


@Alex Paliarush,启用安全密钥后如何使此工作正常?
阿斯旺斯'16

@Aswanth只需将操作添加到菜单,然后单击它。在这种情况下,Magento将为请求添加适当的安全密钥
Alex Paliarush

@AlexPaliarush谢谢它为我工作..并节省了我的时间
ZOE RULE

这就是问题所在,但是为什么课程中没有讲解这种情况呢?我花了几个小时检查一下... Grrrrrrr
Binod-GoFundMonica

完美的答案!!!+1 :)让我开心
SagarPPanchal

12

router.xml文件(companyName/customModule/etc/adminhtml/router.xml)中,解决方案是使路由ID和frontName具有相同的值。在您的情况下,这将是:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
    <router id="admin">
        <route id="asw_advanved" frontName="asw_advanved">
            <module name="Asw_Sample" before="Magento_Backend"/>
        </route>
    </router>
</config>

更改 <route id="Bmanager" frontName="bmanager"><route id="bmanager" frontName="bmanager">,现在我可以使基本控制器按问题正文所述工作。我的自定义控制器仍然不走运。编辑:实际上,我的自定义控制器之一开始出现一些错误。比没有错误的重定向要好得多。
阿德里安·莫伊萨

4

也许最好使用该属性:

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var array
 */
protected $_publicActions = ['action_name'];

2

尝试访问后端(Adminhtml)中的模块/功能时,Magento会检查密码是否存在Form Keys,以及是否/何时有人尝试访问操作并且不提供FormKey(例如:热链接url)和/或提供了无效的FormKey-Adminhtml AbstractAction(Magento \ Backend \ App \ AbstractAction)将路由用户Admin UIX定义的“启动”页面(通常是“仪表板”页面)

[此机制提供了一个“安全检查点”,可防止用户访问他们无法访问的后端部分]


从Admin UIX菜单访问选项时-Magento将自动为您添加FormKey。


为了防止检查FormKey,您有两个选择:

(a)关闭FormKey验证

导航:商店->设置:配置->高级:管理员->安全->设置将“向URL添加密钥”设置为“否”

请记住,这样做会关闭秘密密钥验证,因此可能会使您的应用程序易受攻击,这一点非常重要。

如何关闭FormKey验证

(b)为您的控制器关闭FormKey验证

在管理控制器的“ $ _publicActions”属性中,从FormKey检查中指定要豁免的操作。

受保护的$ _publicActions = ['ENTER_NAME_OF_ACTION'];

代码示例:

class Index extends \Magento\Backend\App\Action
{
    protected $_publicActions = ['index'];

    public function execute()
    {
        echo "My Hello World! Controller";
    }

}

1

在启用安全密钥的情况下进行路由重定向的问题是在/ etc / adminhtml /下的menu.xml中设置的操作URL。

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
        <add id="Mycompany_Mymodule::top_level" module="Mycompany_Mymodule" resource="Magento_Backend::content" sortOrder="9999" title="My Module" parent="Magento_Sales::sales"/>
        <add action="mycompany_mymodule/profile/index" id="Mycompany::mycompany_mymodule_profile" module="mycompany_Mymodule" parent="Mycompany_Mymodule::top_level" resource="Magento_Backend::content" sortOrder="9999" title="My Module"/>
    </menu>
</config>

重要的值是菜单项中的操作参数。请注意将声明在routes.xml中的模块名称设置为id参数。就我而言:“ mycompany_mymodule”

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route frontName="mymodule" id="mycompany_mymodule">
            <module before="Magento_Backend" name="Mycompany_Mymodule"/>
        </route>
    </router>
</config>

0

<input name="form_key" type="hidden" value="<?php echo $block->escapeHtml($block->getFormKey()) ?>" /> 会有所帮助

但您可以在vendor / magento / module-backend / App / AbstractAction.php中添加一个示例

if (!$_isValidFormKey || !$_isValidSecretKey) {}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.