XCLASS - 致命错误:调用未定义的方法

时间:2015-07-27 09:47:56

标签: php typo3 typo3-6.2.x

我正在使用TYPO3 6.2,我想使用XCLASS扩展现有扩展。现有扩展名具有命名空间A.XCLASSes来自namspace B.以下代码定义了一些将被覆盖的类和方法:

namespace A;

class Class1 {
    protected function func1(\A\Class2 obj) {
        //do something
    }
}

class Class2 {...}

namespace B;

class ux_Class1 extends \A\Class1 {
    protected function func1(\A\Class2 obj) {
        parent::func1(obj);
        obj->func2();
    }
}

class ux_Class2 extends \A\Class2 {
    protected function func2() {
        //do something
    }
}

$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects']['A\\Class1'] = array('className' => 'B\\ux_Class1');
$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects']['A\\Class2'] = array('className' => 'B\\ux_Class2');

但是我收到以下错误:

  

致命错误:调用未定义的方法A \ Class2 :: func2()   第6行的B / ux_Class1.php

为什么会这样?由于用XCLASS覆盖,不应该调用B \ ux_Class2 :: func2()吗?

1 个答案:

答案 0 :(得分:0)

这取决于A\Class2的实例化方式。如果使用GeneralUtility::makeInstance()而非new A\Class2()完成,则应该可以使用。在较新的TYPO3版本中不再需要ux_前缀。

如果在 Extbase 上下文中使用该类,则使用ObjectManager处理大多数实例化。在这方面,人们必须在例如直接注册替代实施方案。 ext_localconf.php或通过TypoScript。

ext_localconf.php

/** @var $extbaseObjectContainer \TYPO3\CMS\Extbase\Object\Container\Container */
$extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
    \TYPO3\CMS\Extbase\Object\Container\Container::class
);
$extbaseObjectContainer->registerImplementation(
    \A\Class2::class,
    \B\Class2::class
);

前端TypoScript

config.tx_extbase {
    objects {
        A\Class2 {
            className = B\Class2
        }
    }
}