Magento 2 后台菜单不是只写一个 menu.xml 就结束。菜单项、ACL 资源、adminhtml 路由和控制器必须使用同一组标识,否则会出现菜单不显示、点击 404 或 Access Denied。
声明后台路由
文件:app/code/Alwayly/Reports/etc/adminhtml/routes.xml
<?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 id="alwayly_reports" frontName="alwayly_reports">
<module name="Alwayly_Reports"/>
</route>
</router>
</config>
添加菜单项
文件:etc/adminhtml/menu.xml
<?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="Alwayly_Reports::root" title="Alwayly Reports" module="Alwayly_Reports" sortOrder="80" resource="Alwayly_Reports::root"/>
<add id="Alwayly_Reports::orders" title="Order Report" module="Alwayly_Reports" sortOrder="10" parent="Alwayly_Reports::root" action="alwayly_reports/order/index" resource="Alwayly_Reports::orders"/>
</menu>
</config>
配置 ACL
文件:etc/acl.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl><resources><resource id="Magento_Backend::admin">
<resource id="Alwayly_Reports::root" title="Alwayly Reports">
<resource id="Alwayly_Reports::orders" title="Order Report"/>
</resource>
</resource></resources></acl>
</config>
控制器的 ADMIN_RESOURCE 应与叶子 ACL 一致:
public const ADMIN_RESOURCE = 'Alwayly_Reports::orders';
最后执行 bin/magento setup:upgrade 并清理配置缓存。已有管理员角色需要重新保存权限,菜单才可能出现。若菜单可见但点击 404,优先核对 frontName、action 和控制器目录,而不是修改 ACL。

