You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因分析

  1. 依赖注入配置错误:DbConnection类放在控制器目录下不符合Magento分层规范,且构造函数直接调用ObjectManager(Magento官方不推荐),导致DI容器无法正确解析依赖,进而无法生成控制器的代理类(Interceptor)。
  2. 控制器输出方式不规范:直接使用echo输出内容,违背了Magento的响应机制,可能引发后续渲染问题。
  3. 代理类生成失败:当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:06:13