从 TYPO3 v9 升级到 v10 后:显示页面不再有效(无法访问受保护 属性)
After upgrade from TYPO3 v9 to v10: Show Pages no longer work (Cannot access protected property)
我写了一个基于TYPO3 版本9 的扩展。我现在已经把它安装在TYPO3 版本10 的系统上,一切似乎都运行良好。只是show页面打不开
错误来了:
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;
}
}
问题是您使用 @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
与模型有直接关系。
@TYPO3\CMS\Extbase\Annotation\ORM\Lazy
注解有助于ObjectStorage
使用,不建议直接用于其他机型
这似乎是 TYPO3 核心中的错误 -
另见:https://forge.typo3.org/issues/92357
我写了一个基于TYPO3 版本9 的扩展。我现在已经把它安装在TYPO3 版本10 的系统上,一切似乎都运行良好。只是show页面打不开
错误来了:
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;
}
}
问题是您使用 @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
与模型有直接关系。
@TYPO3\CMS\Extbase\Annotation\ORM\Lazy
注解有助于ObjectStorage
使用,不建议直接用于其他机型
这似乎是 TYPO3 核心中的错误 - 另见:https://forge.typo3.org/issues/92357