TYPO3从v7升级到v8后<f:link.action>无法渲染为链接问题咨询
这问题我之前帮朋友排查过,TYPO3 v8对Extbase和Fluid的参数传递做了不少严格化调整,你遇到的就是典型的对象传递兼容性问题!
在TYPO3 v7里,你可以直接把对象塞进f:link.action的arguments里,Extbase会自动处理序列化生成链接;但到了v8,为了性能和安全,官方禁止了直接传递对象作为链接参数,必须改用对象的唯一标识(比如uid)来传递,然后在控制器里重新查询对象。
第一步:修改Fluid模板代码
把原来传递对象的写法改成传递对象的uid,你这里显示的是employeeInfo.name,对应的对象应该是employeeInfo,所以模板代码改成:
<f:link.action action="show" arguments="{employee : employeeInfo.uid}"> {employeeInfo.name}</f:link.action>
如果你的name变量确实是另一个指向员工对象的变量,就把employeeInfo.uid换成name.uid就行。
第二步:调整控制器的showAction方法
原来的控制器方法可能是直接接收员工对象,现在要改成接收uid参数,然后通过仓库查询出对应的对象:
public function showAction(int $employee) { // 假设你的员工仓库是employeeRepository,记得提前注入哦 $employeeObject = $this->employeeRepository->findByUid($employee); $this->view->assign('employee', $employeeObject); }
如果你的控制器之前用了类型提示接收对象(比如(\Vendor\YourExt\Domain\Model\Employee $employee)),现在要改成接收int类型的uid,或者直接用$employee(不写类型)再查询对象。
额外排查点
如果改了之后还是不行,可以检查这两点:
- 看看模板里的
arguments参数有没有多余空格,比如employee : name里的空格,虽然Fluid一般能识别,但改成employee: name更稳妥; - 打开TYPO3后端的「系统」>「日志」,看看有没有参数传递相关的错误(比如变量不存在),能快速定位问题。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

