TYPO3 Extbase:控制器分配对象至视图后传递到局部模板时出现Null错误
问题背景
我在TYPO3 Extbase的Termin控制器中编写了showAction,不仅把Termin对象分配给视图,还通过getter方法获取了关联的Kaufmnnisch对象并赋值:
public function showAction(\...\Kundentermine\Domain\Model\Termin $termin) { $this->view->assign('termin', $termin); $this->view->assign('kaufmnnisch', $termin->getZugewkaufmaennisch()); }
对应的模板里需要展示Termin详情,同时添加链接调用Kaufmnnisch控制器的showAction,传入这个关联对象:
<tr> <td> <f:link.action action="show" controller="Kaufmnnisch" arguments="{kaufmnnisch : kaufmnnisch}"> <f:translate key="tx_kundentermine_domain_model_termin.kaufmaennisch" /> </f:link.action> {termin.kaufmaennisch} </td> <td> </td> </tr>
但运行时出现错误:
Argument 1 passed to ...\Kundentermine\Controller\KaufmnnischController::showAction() must be an instance of ...\Kundentermine\Domain\Model\Kaufmnnisch, null given
奇怪的是,在控制器里用var_dump($termin->getZugewkaufmaennisch())能得到正确的对象实例,但视图里传递时却变成了Null。
补充:Kaufmnnisch控制器的showAction代码如下:
/** * action show * * @param \...\Kundentermine\Domain\Model\Kaufmnnisch $kaufmnnisch * @return void */ public function showAction(\...\Kundentermine\Domain\Model\Kaufmnnisch $kaufmnnisch) { $this->view->assign('kaufmnnisch', $kaufmnnisch); }
问题根源
这个问题其实是视图变量作用域导致的:虽然我们在控制器里把kaufmnnisch分配给了主视图,但如果这段模板代码是写在一个被<f:render>调用的partial里,而调用partial时没有把kaufmnnisch作为参数传递进去,那么partial内部是访问不到这个变量的,自然就会传入Null给控制器的showAction。
解决方法
在调用partial的时候,务必把需要用到的所有变量都通过arguments参数传递进去,修改后的调用代码如下:
<f:render partial="Termin/Properties" arguments="{termin:termin, kaufmnnisch:kaufmnnisch}" />
这样partial里就能正常获取到kaufmnnisch对象,链接传参也就恢复正常了。
内容的提问来源于stack exchange,提问作者Mondblut

