2

由于使用 PHP 7.0 及更高版本,php 的严格模式会生成如下警告:

PHP Warning: Declaration of In2code\Femanagerextended\Controller\EditController::updateAction(In2code\Femanagerextended\Domain\Model\User $user) should be compatible with In2code\Femanager\Controller\EditController::updateAction(In2code\Femanager\Domain\Model\User $user) in ($PATH)\typo3conf\ext\femanagerextended\Classes\Controller\EditController.php line 17

当尝试使用手册最佳实践部分中描述的方式扩展 TYPO3 Extension femanager 的现有控制器时:

<?php
namespace In2code\Femanagerextended\Controller;
use In2code\Femanager\Controller\EditController as EditControllerFemanager;
use In2code\Femanagerextended\Domain\Model\User;
/**
 * Class EditController
 *
 * @package In2code\Femanagerextended\Controller
 */
class EditController extends EditControllerFemanager
{
    /**
     * action update
     *
     * @param User $user
     * @validate $user In2code\Femanager\Domain\Validator\ServersideValidator
     * @validate $user In2code\Femanager\Domain\Validator\PasswordValidator
     * @return void
     */
     public function updateAction(User $user)
     {
         parent::updateAction($user);
     }
}
4

2 回答 2

7

Wolfgang Klinger 提出的一个可能的解决方案是对 \TYPO3\CMS\Extbase\Mvc\Controller\Argument 类进行 XClass。

这个类有一个受保护的属性“dataType”,它通常没有设置器。

使用 TYPO3 的 XClass 机制,可以添加一个 setDataType 方法来启用该属性的手动覆盖。

有了这个,现在可以覆盖扩展编辑/邀请/新控制器的(魔术)初始化操作中通常自动检测到的数据类型。

重要的是,不要更改“正常”操作(newAction、createAction ...)的类型提示和注释,而是在相应的初始化操作中添加类似这样的内容:

public function initializeNewAction()
{
    if ($this->arguments->hasArgument('user')) {
        // Workaround to avoid php7 warnings of wrong type hint.
        /** @var \Mediagear\Jdcompetition\Xclass\Extbase\Mvc\Controller\Argument $user */
        $user = $this->arguments['user'];
        $user->setDataType(\Vendor\Extension\Domain\Model\User::class);
    }
}
于 2017-08-08T09:21:06.067 回答
3

完整答案/教程...

femanager您可以使用以下教程扩展 TYPO3 。旧的扩展femanagerextended是不必要的。这适用于TYPO3and PHP 5.x。这是解决方法PHP 7.x

添加一个新的 XCLASS 文件 fe typo3conf/ext/yourext/Classes/Xclass/Extbase/Mvc/Controller/Argument.php

namespace Yournamespace\Yourext\Xclass\Extbase\Mvc\Controller;
class Argument extends \TYPO3\CMS\Extbase\Mvc\Controller\Argument

{
    /**
     * Set data type for femanager workaround.
     * Workaround to avoid php7 warnings of wrong type hint.
     *
     * @param $dataType
     * @return $this
     */
    public function setDataType($dataType) {
        $this->dataType = $dataType;
        return $this;
    }
}

更改文件typo3conf/ext/yourext/Classes/Controller/EditController.php

namespace Yournamespace\Yourext\Controller;
use \Yournamespace\Yourext\Domain\Model\User;
class EditController extends \In2code\Femanager\Controller\EditController {

    /**
     * @return void
     */
    public function initializeUpdateAction()
    {
        if ($this->arguments->hasArgument('user')) {
            // Workaround to avoid php7 warnings of wrong type hint.
            /** @var \Yournamespace\Yourext\Xclass\Extbase\Mvc\Controller\Argument $user */
            $user = $this->arguments['user'];
            $user->setDataType(\Yournamespace\yourext\Domain\Model\User::class);
        }
    }

    /**
     * action update
     *
     * @param User $user
     * @validate $user In2code\Femanager\Domain\Validator\ServersideValidator
     * @validate $user In2code\Femanager\Domain\Validator\PasswordValidator
     * @validate $user In2code\Femanager\Domain\Validator\CaptchaValidator
     * @return void
     */
    public function updateAction(\In2code\Femanager\Domain\Model\User $user) {
        parent::updateAction($user);
    }
}

更改文件typo3conf/ext/yourext/Classes/Controller/NewController.php

namespace Yournamespace\Yourext\Controller;
use Yournamespace\Yourext\Domain\Model\User;
class NewController extends \In2code\Femanager\Controller\NewController {

    /**
     * Initialize create action for setting the right custom data type for the user.
     */
    public function initializeCreateAction() {
        if ($this->arguments->hasArgument('user')) {
            // Workaround to avoid php7 warnings of wrong type hint.
            /** @var \Yournamespace\Yourext\Xclass\Extbase\Mvc\Controller\Argument $user */
            $user = $this->arguments['user'];
            $user->setDataType(\Yournamespace\Yourext\Domain\Model\User::class);
        }
    }


    /**
     * action create
     *
     * @param User $user
     * @validate $user In2code\Femanager\Domain\Validator\ServersideValidator
     * @validate $user In2code\Femanager\Domain\Validator\PasswordValidator
     * @return void
     */
    public function createAction(User $user)
    {
        parent::createAction($user);
    }
}

将您的 XCLASS 注册到ext_localconf.php$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects']['TYPO3\\CMS\\Extbase\\Mvc\\Controller\\Argument'] = array('className' => 'Yournamespace\\Yourext\\Xclass\\Extbase\\Mvc\\Controller\\Argument');

通过安装工具清除缓存和清除自动加载器!

这个问题也有帮助。

于 2018-07-02T06:44:51.690 回答