“类不存在。反射失败。”延迟加载和对象存储

时间:2019-05-15 13:20:32

标签: php reflection typo3 storage typo3-9.x

我正在将网站从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;而不是内置在injectlazy中,这无效。


编辑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();
    }
    :

3 个答案:

答案 0 :(得分:1)

在9.0版中,注释@lazy@TYPO3\CMS\Extbase\Annotation\ORM\Lazy取代。

也许这可以帮助:https://docs.typo3.org/typo3cms/extensions/core/latest/Changelog/9.0/Feature-83078-ReplaceLazyWithTYPO3CMSExtbaseAnnotationORMLazy.html

答案 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),则值得在这种情况下搜索页面上的所有三个错误。
在我的情况下,最后一条错误消息提到语法错误,然后自然不加载该类-但是我可以更正语法错误,然后一切正常。