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

Magento 2:不使用Object Manager在.phtml文件调用其他类对象的最佳实践

Magento 2 .phtml文件中实例化类对象的最佳实践

Magento 2官方明确禁止在.phtml模板中直接使用ObjectManager,因为这会绕过框架的依赖注入体系,导致代码难以测试、维护,也不符合架构规范。正确的做法是通过对应模板的Block类来传递所需的依赖对象,具体步骤如下:

1. 在Block类中注入目标类

找到当前.phtml对应的Block类(通常在Vendor/Module/Block/目录下),在构造函数中注入你需要调用xyz方法的类,然后提供公开方法供模板调用。

示例代码:

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
// 替换成你要调用xyz方法的实际类
use Vendor\Module\Model\YourTargetClass;

class YourBlock extends Template
{
    protected $targetClass;

    public function __construct(
        Template\Context $context,
        YourTargetClass $targetClass,
        array $data = []
    ) {
        $this->targetClass = $targetClass;
        parent::__construct($context, $data);
    }

    // 提供公开方法,让模板能获取到这个实例
    public function getTargetClassInstance()
    {
        return $this->targetClass;
    }
}

2. 在.phtml模板中调用Block方法获取实例

模板里不需要自己实例化类,直接通过$block对象调用Block中定义的方法,拿到实例后再执行xyz方法。

示例代码:

<?php
// 从Block获取目标类实例
$targetInstance = $block->getTargetClassInstance();
// 调用xyz方法
$xyzResult = $targetInstance->xyz();
?>

额外注意

  • 模板的职责应该仅限于渲染内容,所有的依赖注入、数据逻辑都应该放在Block或Model层处理
  • 绝对不要在模板中使用\Magento\Framework\App\ObjectManager::getInstance()这种写法,遵循依赖注入的规范才能保证代码的可扩展性和可维护性

内容的提问来源于stack exchange,提问作者Haroon Khurshid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:10:31