我正在将网站从TYPO3 8升级到TYPO3 9
所有代码都可以在TYPO3 8上正常运行。
现在,我不得不对它进行修改,因为它来自更早的TYPO3(TCA,原则...),并且引发了一些错误。
此刻,我在某些页面上遇到了问题,我仅收到此错误(稍作修改):
(1/2)#1278450972 TYPO3 \ CMS \ Extbase \ Reflection \ Exception \ UnknownClassException
类VendorName \ VendorExtensionName \ Domain \ Model \ TYPO3 \ CMS \ Extbase \ Persistence \ ObjectStorage不存在。反射失败。
我认为它是由以下代码触发的:
<?php
namespace VendorName\VendorExtensionName\Controller;
use TYPO3\CMS\Extbase\Annotation\Inject;
class AnsprechpartnerController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* ansprechpartnerRepository
*
* @Inject
* @var \VendorName\VendorExtensionName\Domain\Repository\AnsprechpartnerRepository
*/
protected $ansprechpartnerRepository;
[...]
/**
* action showDetail
*
* @return void
*/
public function showDetailAction() {
$pids = $this->settings['pids'];
$this->settings['ansprechpartner'] = explode(',', $this->settings['ansprechpartner']);
foreach ($this->settings['ansprechpartner'] as $uid) {
$person = $this->ansprechpartnerRepository->findByUid($uid);
[...]
最后一行在调试堆栈中。
扩展名具有8种相互关联的记录。因此,我假设定义了关系lazy
并使用了对象存储。
<?php
namespace VendorName\VendorExtensionName\Domain\Model;
use TYPO3\CMS\Extbase\Annotation\ORM\Lazy;
/**
*
* @package vendor_extension_name
*
*/
class Ansprechpartner extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
[...]
/**
* Organisationseinheit
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\VendorName\VendorExtensionName\Domain\Model\Organisation>
* @Lazy
*/
protected $organisationseinheit;
/**
* Dienstleistungen
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\VendorName\VendorExtensionName\Domain\Model\AnsprechpartnerDienstleistung>
* @Lazy
*/
protected $dienstleistungen = NULL;
[...]
但是这里混合类的顺序是相反的。
尽管如此,这可能是现有名称空间VendorName\VendorExtensionName\Domain\Model
[\Ansprechpartner
]和
混合/串联的原因
\TYPO3\CMS\Extbase\Persistence\ObjectStorage
更改为奇怪的类名称
VendorName\VendorExtensionName\Domain\Model\TYPO3\CMS\Extbase\Persistence\ObjectStorage
,当然不存在。
编辑:
插入
的用法
use TYPO3\CMS\Extbase\Annotation\Inject;
和
use TYPO3\CMS\Extbase\Annotation\ORM\Lazy;
而不是内置在inject
和lazy
中,这无效。
编辑2:
存储的初始化(来自上述类的示例):
class Ansprechpartner extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{
:
/**
* __construct
*
* @return Ansprechpartner
*/
public function __construct() {
$this->initStorageObjects();
}
/**
* Initializes all ObjectStorage properties.
*
* @return void
*/
protected function initStorageObjects() {
$this->organisationseinheit = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
$this->dienstleistungen = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
:
答案 0 :(得分:1)
在9.0版中,注释@lazy
被@TYPO3\CMS\Extbase\Annotation\ORM\Lazy
取代。
答案 1 :(得分:1)
我们发现,这是由于9.x中的更改所致,注释和TypeHints现在支持相对命名空间。
在9.x之前,Extbase Reflection始终假定绝对名称空间。
如果有一个带有此签名的方法,则该方法在9.x之前可用(这是一个Bug),并且从9.x开始不再可用:
public function setSomeStorage(TYPO3\CMS\Extbase\Persistence\ObjectStorage $storage) {
这必须是:
public function setSomeStorage(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $storage) {
答案 2 :(得分:0)
如果显示的错误消息带有如下所示的前导括号:(1/3)
,则值得在这种情况下搜索页面上的所有三个错误。
在我的情况下,最后一条错误消息提到语法错误,然后自然不加载该类-但是我可以更正语法错误,然后一切正常。