从 TYPO3 v9 升级到 v10 后:显示页面不再工作(无法访问受保护的财产)

Posted

技术标签:

【中文标题】从 TYPO3 v9 升级到 v10 后:显示页面不再工作(无法访问受保护的财产)【英文标题】:After upgrade from TYPO3 v9 to v10: Show Pages no longer work (Cannot access protected property) 【发布时间】:2021-03-08 02:34:19 【问题描述】:

我已经编写了一个基于 TYPO3 版本 9 的扩展程序。我现在已经将它安装在 TYPO3 版本 10 系统中,一切似乎都运行良好。只有表演页面不能再打开了。

错误来了:

Cannot access protected property myname\myextension\Domain\Model\Country::$name

我不明白这个错误。在列表页面上,我通常使用国家名称。在显示页面上,我根本不使用它。因此,为什么这会导致问题是没有意义的。

这是我的 Show.html

<div class="card">
    <h5 class="card-header" style="text-align: center">
        house.name
    </h5>
    <div class="card-body" style="text-align: center">
        <p class="card-text">
            <f:link.external uri="house.link" target="_blank">house.link</f:link.external>
        </p>
        <h2>Rooms</h2>
        <ul>
            <f:for each="house.room" as="room">
                <li>room.name</li>
            </f:for>
        </ul>
    </div>
</div>
<f:link.action action="list" class="btn btn-primary">
    BACK
</f:link.action>

我的控制器

class HouseController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController

............
............
    /**
     * @param House $house
     */
    public function showAction(House $house)
    
        $this->view->assign('house', $house);
    

正如之前所说的完整代码在版本 9 上可以正常工作,版本 10 中肯定存在一些问题。

编辑: 这是我的国家模式

class Country extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity


    /**
     * Country Name
     * 
     * @var string
     * @TYPO3\CMS\Extbase\Annotation\Validate("NotEmpty")
     */
    protected $name = '';

    /**
     * Returns the name
     * 
     * @return string $name
     */
    public function getName()
    
        return $this->name;
    

    /**
     * Sets the name
     * 
     * @param string $name
     * @return void
     */
    public function setName($name)
    
        $this->name = $name;
    

这里是我的房屋模型(不是所有线):

class House extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity

    /**
     * __construct
     */
     public function __construct()
     

            //Do not remove the next line: It would break the functionality
            $this->initStorageObjects();
     
    /**
     * Countrie House
     * 
     * @var \myname\myextension\Domain\Model\Country
     * @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
     */
    protected $country = null;

    /**
     * Returns the country
     * 
     * @return \myname\myextension\Domain\Model\Country $country
     */
    public function getCountry()
    
        return $this->country;
    

    /**
     * Sets the country
     * 
     * @param \myname\myextension\Domain\Model\Country $country
     * @return void
     */
    public function setCountry(\myname\myextension\Domain\Model\Country $country)
    
        $this->country = $country;
    

【问题讨论】:

我在您的 HTML 和控制器中没有看到任何国家/地区模型。该模型在哪里使用?国家模式又是怎样的? 在我的 Show HTML 中确实没有国家模型。太疯狂了。但是每个 House Model 都与一个国家有关系。 (一栋房子正好在一个国家,一栋房子有几个房间。)但是这个模型也用在 List.html 中并且没有错误。 你应该提供更多信息,House模型的代码是什么? 好的,我已经添加了我的国家和房屋模型 您可以删除房屋模型中的 Lazy 部分并重试吗?当然,删除后清除所有缓存。 【参考方案1】:

问题是您使用@TYPO3\CMS\Extbase\Annotation\ORM\Lazy 与模型建立直接关系。 @TYPO3\CMS\Extbase\Annotation\ORM\Lazy 注解有助于ObjectStorage 使用,不建议直接用于其他模型。

【讨论】:

以上是关于从 TYPO3 v9 升级到 v10 后:显示页面不再工作(无法访问受保护的财产)的主要内容,如果未能解决你的问题,请参考以下文章

TYPO3 v10 动作控制器和子文件夹内的模板

TYPO3 V10 - EXT:news 自定义类型和持久性映射

Typo3 V9 重定向带虚拟子文件夹

如何在 TYPO3 v9 URL 中添加斜杠?

TYPO3 v10 持久性映射

TYPO3 升级(7.6 到 10):未找到站点配置