Magento中Index.php连库显示产品遇Interceptor类不存在错误
Magento 2 控制器报错:Class "Vendor\Module\Controller\Index\Index\Interceptor" 不存在
错误信息
Exception #0 (ReflectionException): Class "Vendor\Module\Controller\Index\Index\Interceptor" does not exist
用户提供的代码与目录
原Index.php代码
<?php namespace Vendor\Module\Controller\Index; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\View\Result\PageFactory; class Index extends Action { public $pageFactory; public $dbConnection; public function __construct(Context $context, PageFactory $pageFactory, DbConnection $dbConnection) { parent::__construct($context); $this->pageFactory = $pageFactory; $this->dbConnection = $dbConnection; } public function execute() { //Fazer a connection à base de dados $connection = $this->dbConnection->getConnection(); //Fazer fetch de todos os dados da db $query = 'SELECT * FROM magento2_produtos'; $result = $connection->fetchAll($query); //Exibir os Dados na bd echo '<h1> Dados da Tabela </h1>'; if(!empty($result)){ echo '<ul>'; foreach ($result as $row){ echo '<li> ID:' . $row['id'] . 'title:' . $row['title'] . 'Done' . $row['done'] . 'created_at' . $row['created_at'] . 'updated_at' .$row['updated_at'] . '</li>' ; } echo '</ul>'; }else{ echo '<h3> Dados nao foram encontrados </h3>'; } } }
原DbConnection.php代码
namespace Vendor\Module\Controller\Index; use Magento\Framework\App\ObjectManager; use Magento\Framework\App\ResourceConnection; class DbConnection { public $connection; public function __construct() { $objectManager = ObjectManager::getInstance(); //ResourceConnection para obter a base de dados $resource = $objectManager->get(ResourceConnection::class); $this->connection = $resource->getConnection(); } public function getConnection() { return $this->connection; } }
原文件目录
- Vendor/Module/Controller/Index/Index.php
- Vendor/Module/Controller/Index/DbConnection.php
错误原因分析
- 依赖注入配置错误:
DbConnection类放在控制器目录下不符合Magento分层规范,且构造函数直接调用ObjectManager(Magento官方不推荐),导致DI容器无法正确解析依赖,进而无法生成控制器的代理类(Interceptor)。 - 控制器输出方式不规范:直接使用
echo输出内容,违背了Magento的响应机制,可能引发后续渲染问题。 - 代理类生成失败:当DI容器无法解析控制器的依赖时,Magento无法自动生成
Index\Interceptor代理类,从而抛出该错误。
解决方案
1. 调整目录结构
将DbConnection类移至Model目录,符合Magento分层架构:
- Vendor/Module/Controller/Index/Index.php
- Vendor/Module/Model/DbConnection.php
2. 重构DbConnection类(使用依赖注入替代ObjectManager)
<?php namespace Vendor\Module\Model; use Magento\Framework\App\ResourceConnection; class DbConnection { private $connection; public function __construct(ResourceConnection $resource) { $this->connection = $resource->getConnection(); } public function getConnection() { return $this->connection; } }
3. 修正Index控制器代码(规范依赖注入与响应输出)
<?php namespace Vendor\Module\Controller\Index; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\Controller\Result\RawFactory; use Vendor\Module\Model\DbConnection; class Index extends Action { private $rawResultFactory; private $dbConnection; public function __construct( Context $context, RawFactory $rawResultFactory, DbConnection $dbConnection ) { parent::__construct($context); $this->rawResultFactory = $rawResultFactory; $this->dbConnection = $dbConnection; } public function execute() { // 获取数据库连接 $connection = $this->dbConnection->getConnection(); // 查询数据表 $query = 'SELECT * FROM magento2_produtos'; $result = $connection->fetchAll($query); // 构建输出内容 $output = '<h1> 数据表内容 </h1>'; if (!empty($result)) { $output .= '<ul>'; foreach ($result as $row) { $output .= '<li> ID:' . $row['id'] . ' 标题:' . $row['title'] . ' 完成状态:' . $row['done'] . ' 创建时间:' . $row['created_at'] . ' 更新时间:' . $row['updated_at'] . '</li>'; } $output .= '</ul>'; } else { $output .= '<h3> 未找到数据 </h3>'; } // 使用RawResult返回响应内容 $result = $this->rawResultFactory->create(); $result->setContents($output); return $result; } }
4. 执行Magento命令重建DI与缓存
# 清除所有缓存 bin/magento cache:clean bin/magento cache:flush # 生成DI配置与代理类 bin/magento setup:di:compile # 生产模式下需部署静态内容(可选) bin/magento setup:static-content:deploy -f
5. 验证结果
刷新浏览器,检查页面是否正常显示数据表内容。
内容的提问来源于stack exchange,提问作者João Alves
相关产品推荐
相关产品推荐

