将参数传递给不同的控制器或备选方案

时间:2016-11-04 14:52:21

标签: typo3 extbase typo3-6.2.x

在我的extbase扩展程序中,我有一个约会模型,用户可以写出有关约会的反馈 所以我创建了一个包含不同领域的反馈模型 现在,当用户点击"创建反馈"按钮?
到目前为止,我得到了这个,但它没有工作:

<f:link.action action="edit" controller="Feedback" arguments="{appointment:appointment}">

我收到错误:

  

参数1传递给   ... Controller \ FeedbackController :: newAction()必须是一个实例   ... \ Model \ Appointment,none given

FeedbackController:

     /**
     * action new
     * @param ...\Domain\Model\Appointment $appointment
     * @return void
     */
    public function newAction(...\Domain\Model\Appointment $appointment) {
        $this->view->assign('appointment', $appointment);
    }

为什么会出现此错误? (约会对象肯定在那里,我调试了它)
我认为它必须与从AppointmentController切换到FeedbackController有关。

实现此目标的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

如果使用不同的插件,则需要在链接生成中使用pluginName参数。

<f:link.action action="edit" controller="Feedback" pluginName="your_plugin" arguments="{appointment:appointment}">

当生成链接时,TYPO3会为链接的参数添加“名称空间”,如下所示:tx_myplugin [action] = new。确保pluginName与您在ext_localconf.php中定义的相同。在这种情况下,pluginName将是your_plugin。

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'Vendor.' . $_EXTKEY,
    'your_plugin',
    array(
        'Feedback' => 'new',
    ),
    // non-cacheable actions
    array(
        'Feedback' => '',
    )
);

答案 1 :(得分:0)

检查ext_localconf.php中的plugin-controller-action数组并发布它。也许有些不对劲。

答案 2 :(得分:0)

如果您收到此错误:

  

参数1传递给... Controller \ FeedbackController :: newAction()   必须是... \ Model \ Appointment的实例,没有给出

这是因为你给控制器一个NULL对象,并且你的控制器不允许这样做。

要避免此错误,您可以在控制器中允许NULL对象:

   /**
     * action new
     * @param ...\Domain\Model\Appointment $appointment
     * @return void
     */
    public function newAction(...\Domain\Model\Appointment $appointment=NULL) {
        $this->view->assign('appointment', $appointment);
    }

这很奇怪,因为在你的链接中,你调用了一个动作'edit'而你在'newAction'控制器而不是'editAction'控制器中有一个错误,你应该允许你的插件允许'编辑'动作(cachable或不):

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'Vendor.' . $_EXTKEY,
    'your_plugin',
    array(
        'Feedback' => 'edit',
    ),
    // non-cacheable actions
    array(
        'Feedback' => 'edit',
    )
);

并且如Natalia所写,如果您要调用的操作属于另一个插件,请添加插件名称。

<f:link.action action="edit" controller="Feedback" pluginName="your_plugin" arguments="{appointment:appointment}">

弗洛里安