Magento2.4自定义404页出现空对象调用get()、返回类型报错求助
Magento 2.4 自定义404控制器报错解决方案
报错根因说明
- 继承
Magento\Framework\App\Action\Action报错:该抽象类构造依赖Magento\Framework\App\Action\Context实例,你的控制器没有声明构造方法传入该依赖,导致父类初始化时Context对象为null,触发空对象调用方法的错误。另外Magento 2.4起官方已不推荐直接继承该类,优先使用实现ActionInterface的方案。 - 实现
ActionInterface后报无效返回类型错误:Magento控制器execute方法禁止直接输出内容,必须返回合规的响应实例,允许的返回类型为Magento\Framework\App\ResponseInterface或Magento\Framework\Controller\ResultInterface,直接echo后无合法返回值就会触发该异常。
正确实现代码
方案1:直接输出自定义内容(简单场景)
<?php namespace SimplifiedMagento\RequestFlow\Controller\Page; use Magento\Framework\App\ActionInterface; use Magento\Framework\Controller\Result\RawFactory; class CustomNoRoute implements ActionInterface { public function __construct( private RawFactory $rawResultFactory ) {} public function execute() { $result = $this->rawResultFactory->create(); // 标记为404状态码 $result->setHttpResponseCode(404); $result->setContents('this is our custom 404'); return $result; } }
方案2:适配Magento前端布局(符合原生开发规范)
<?php namespace SimplifiedMagento\RequestFlow\Controller\Page; use Magento\Framework\App\ActionInterface; use Magento\Framework\View\Result\PageFactory; class CustomNoRoute implements ActionInterface { public function __construct( private PageFactory $resultPageFactory ) {} public function execute() { $resultPage = $this->resultPageFactory->create(); // 标记为404状态码 $resultPage->setStatusHeader(404, '1.1', 'Not Found'); $resultPage->getConfig()->getTitle()->set('404 页面未找到'); // 可搭配对应layout.xml自定义页面块、样式,复用站点公共头尾 return $resultPage; } }
注意事项
- 修改代码后需执行
bin/magento setup:di:compile、bin/magento cache:clean命令生效。 - 需在模块
etc/frontend/routes.xml中配置no_route节点,或者配置noRouteHandler,才能让系统识别该控制器为自定义404页面。
内容的提问来源于stack exchange,提问作者askcoder
相关产品推荐
相关产品推荐

