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。