Как расширить контроллер femanager под php 7

Поскольку используется 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 femmanager, используя способ, описанный в разделе с лучшими практиками руководства:

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

person Alexander Grein    schedule 08.08.2017    source источник


Ответы (2)


Возможное решение, разработанное Вольфгангом Клингером, состоит в том, чтобы XClass класс \TYPO3\CMS\Extbase\Mvc\Controller\Argument.

Этот класс имеет защищенное свойство "dataType", которое обычно не имеет установщика.

Используя механизм XClass TYPO3, можно добавить метод 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);
    }
}
person Alexander Grein    schedule 08.08.2017
comment
Спасибо за ваше объяснение! Мне нужно передать некоторые дополнительные данные в представление в newAction(), и я получаю именно ваше предупреждение PHP7. Как мне этого добиться, если $this-›view недоступен в initializeNewAction()? Кстати, не могли бы вы объяснить свой пример с initializeNewAction() немного подробнее? Например. что такое /** @var \Mediagear\Jdcompetition\Xclass\Extbase\Mvc\Controller\Argument $user */ Является ли это наследством исходной модели пользователя? Спасибо еще раз! - person chris; 09.02.2018
comment
Чтобы узнать, как добавить новые свойства в одно из представлений, обратитесь к руководству пользователя femanger. /** @var — это всего лишь подсказка типа для моего ide, чтобы получить завершение кода для var $user - person Alexander Grein; 11.02.2018
comment
Спасибо еще раз! Я добавил необходимые переменные с помощью метода initializeView(). Кстати: есть еще одно обсуждение и подробный ответ на эту тему: Extend TYPO3 femanager - person chris; 12.02.2018

Полный ответ/учебник...

Вы можете расширить TYPO3 femanager с помощью следующего учебника. Старое расширение femanagerextended не нужно. Это прекрасно работает с TYPO3 и PHP 5.x. Вот обходной путь для PHP 7.x:

Добавьте новый XCLASS-файл, например. 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');

Очистите кеш и очистите автозагрузчик с помощью инструмента установки!

Эта проблема также помогает.

person user2310852    schedule 02.07.2018
comment
Привет всем .. вчера я сделал несколько дополнительных полей для femananger, TYPO3 8.7 и PHP7 без всех этих настроек (Xclass и т. д.). Я установил femanagerextended и изменил зависимости в ext_emconf.php и обновил классы контроллеров, см. пример: docs.typo3.org/typo3cms/extensions/femanager/Features/NewFields/ - person user2310852; 13.09.2018
comment
Эта ссылка также помогает: github.com/in2code-de/femanager/issues/185 Проблемы с кэшированием с помощью femanager и femanagerextended - person user2310852; 24.11.2020