如何通过一个表单为多个模型对象设置值?

时间:2016-04-29 10:40:27

标签: typo3 extbase typo3-7.6.x

我使用TYPO3 7.6和extbase。 我有模型“Ticket”,“Answer”和“Status”

full-size-kana

在答案控制器中

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);
 }

我得到了

“PHP Catchable致命错误:传递给Domain \ Model \ Ticket :: setStatus()的参数1必须是Domain \ Model \ Status的实例,null给出”

如何通过一个表单为多个模型对象设置值?创建答案时设置故障单的状态。

1 个答案:

答案 0 :(得分:0)

这个问题已经很老了:

如果它们共享相同的接口,则可以键入提示并将不同的对象类型分配为参数。然后,类型提示必须是关于接口的,而不是特定的对象或其他数据类型:

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开始,您还有更多选择: