我使用TYPO3 7.6和extbase.我有模型 "Ticket","Answer "和 "Status"。
Ticket n:1 -> Status;
Ticket 1:n -> Answer;
Answer n:1 -> Ticket;
Status 1:n -> Ticket;
答案控制器
public function createAction(\Vendor\Extname\Domain\Model\Ticket $ticket, \Vendor\Extname\Domain\Model\Answer $newAnswer)
{
//Set tikcet and it's normaly
$newAnswer->setTicket($ticket);
// Try to set status and get error
$newAnswer->getTicket($ticket)->setStatus($status);
}
在模板AnswerNew中
<f:form action="create" method="POST" enctype="multipart/form-data" name="newAnswer" controller="Answer" object="{newAnswer}"
arguments="{ticket:ticket}">
<f:form.select class="form-control" property="ticket.status" name="status" options="{status}"
optionLabelField="title"
optionValueField="uid" />
</f:form>
我得到
"PHP可捕获的致命错误,传给Domain/Model/Ticket::setStatus()的Argument 1必须是Domain/Model/Status的实例,给定为空"。传递给Domain/Model/Ticket::setStatus()的参数1必须是Domain/Model/Status的实例,给定为null"
如何通过一个表单设置多个模型对象的值?当我创建答案时,为票据设置状态。
即使是这个问题也是相当古老的问题。
如果不同的对象类型共享同一个接口,你可以进行类型提示并将其作为参数。那么类型提示必须是关于接口的,而不是特定的对象或其他数据类型。
namespace Vendor\Extname\Domain\Model;
interface AnswerOrStatusInterface
{
// can be empty or include common methods of both types
}
class answer implements \Vendor\Extname\Domain\Model\AnswerOrStatusInterface
{
...
}
class status implements \Vendor\Extname\Domain\Model\AnswerOrStatusInterface
{
...
}
还有控制器的另一个命名空间。
namespace Vendor\Extname\Controller;
class AnswerController
{
public function createAction(
\Vendor\Extname\Domain\Model\Ticket $ticket,
\Vendor\Extname\Domain\Model\AnswerOrStatusInterface $answerOrStatus
) {
$answer = null;
$status = null;
if (is_a($answerOrStatus, \Vendor\Extname\Domain\Model\answer)) {
$answer = $answerOrStatus;
}
elseif (is_a($answerOrStatus, \Vendor\Extname\Domain\Model\status)) {
$status = $answerOrStatus;
}
// further logic
...
}
}
在PHP手册中你可以找到更多关于
从 PHP 7.4 开始,你仍然有更多的选择。