我正在使用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()吗?
答案 0 :(得分:0)
这取决于A\Class2
的实例化方式。如果使用GeneralUtility::makeInstance()
而非new A\Class2()
完成,则应该可以使用。在较新的TYPO3版本中不再需要ux_
前缀。
如果在 Extbase 上下文中使用该类,则使用ObjectManager
处理大多数实例化。在这方面,人们必须在例如直接注册替代实施方案。 ext_localconf.php
或通过TypoScript。
/** @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
);
config.tx_extbase {
objects {
A\Class2 {
className = B\Class2
}
}
}