TYPO3: внедрить служебные классы в AuthServiceClass с помощью конструктора - PullRequest
2 голосов
/ 24 января 2020

Я использую TYPO3 10.2 и пытаюсь внедрить несколько классов обслуживания, которые я создал, в свою службу аутентификации.

class AuthService extends \TYPO3\CMS\Core\Authentication\AuthenticationService

Конструктор в AuthService:

    /**
     * Contains the configuration of the current extension
     * @var ConfigurationService
     */
    protected $configurationService;

    /**
     * @var RestClientService
     */
    protected $restClientService;

    /**
     * @var ConnectionPool
     */
    protected $connectionPool;

    /**
     * 
     * @param ConfigurationService $configurationService
     * @param RestClientService $restClientService
     * @param ConnectionPool $connectionPool
     */
    public function __construct(ConfigurationService $configurationService, RestClientService $restClientService, ConnectionPool $connectionPool)
    {
        $this->configurationService = $configurationService;

        $this->restClientService = $restClientService;

        $this->connectionPool = $connectionPool;
    }

Я получаю следующая ошибка:

Слишком мало аргументов для функции Vendor \ MyExt \ Service \ AuthService :: __ construct (), 0 передано в C: \ xampp \ htdocs \ myproject \ typo3 \ sysext \ core \ Classes \ Utility \ GeneralUtility. php в строке 3461 и ожидается ровно 3

Любой совет, что здесь происходит?

Я использовал тот же конструктор в моем ControllerClass, и все там отлично работает.

Пока спасибо!

1 Ответ

1 голос
/ 24 января 2020

Похоже, что ваш AuthenticationService внутренне создан GeneralUtility::makeInstance(). Это верно для многих классов, которые вы регистрируете в какой-то момент, и TYPO3 затем заботится о создании класса (подумайте о пользовательских функциях, контроллере плагинов, контроллере модулей, службах аутентификации, перехватчиках и т. Д. c).

GeneralUtility::makeInstance() необходимо получить класс из контейнера DI для работы DI, но это возможно только для классов, созданных public во время компиляции контейнера.

По этой причине решение вашей проблемы должно чтобы объявить класс AuthService как publi c в вашем Configuration/Services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  Vendor\MyExt\:
    resource: '../Classes/*'

  Vendor\MyExt\Service\AuthService:
    public: true

Это можно объяснить в официальных документах или в моем блоге пост о том топи c.

...