Symfony4: внедрить сервис в контроллер __construct (конструктор) - PullRequest
0 голосов
/ 25 июня 2018

У меня проблемы с доступом к внедренной службе в конструкторе одного из моих контроллеров.

За http://symfony.com/doc/current/service_container/injection_types.html Мне кажется, что я правильно сделал инъекцию, однако, когда я пытаюсь загрузить представлениеиз контроллера я получаю следующую ошибку:

Argument 1 passed to Regions\AnalyticsBundle\Controller\PatternsController::__construct()
must be an instance of Regions\AnalyticsBundle\Controller\PatternCacheService, instance of
Regions\AnalyticsBundle\Service\PatternCacheService given, called
in /var/tmp/symfony/cache/dev/ContainerLoHUcSH/getPatternsControllerService.php on line 9

Кажется, что ошибка указывает на то, что подсказка типа в конструкторе пытается заставить его искать экземпляр в пространстве имен *\Controller\* вместо *\Services\* namespace - что я делаю не так или не вижу здесь?

Подробности моей настройки следующие:

Symfony 4.1.0, PHP 7.2.5

services.yaml

services:
    ...

    pattern_cache_service:
        class: Regions\AnalyticsBundle\Service\PatternCacheService
        public: true

    Regions\AnalyticsBundle\Controller\PatternsController:
        arguments: ['@pattern_cache_service']

Контроллер:

namespace Regions\AnalyticsBundle\Controller;

class PatternsController extends BaseController
{

    private $pcs;

    public function __construct(PatternCacheService $pcs)
    {
        $this->pcs = $pcs;
    }
}

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Класс PatternCacheService не может быть найден в пространстве имен Regions\AnalyticsBundle\Controller.

Добавить импорт:

<?php

namespace Regions\AnalyticsBundle\Controller;

use Regions\AnalyticsBundle\Service\PatternCacheService;

class PatternsController extends BaseController
{

    private $pcs;

    public function __construct(PatternCacheService $pcs)
    {
        $this->pcs = $pcs;
    }
}

Для справки см.

0 голосов
/ 25 июня 2018
  1. Вам не нужно определение сервиса для pattern_cache_service.Он должен автоматически подключать ваш сервис, если установлен autowire: true.
  2. PatternCacheService должен быть private, так как вы не хотите получать к нему доступ из контейнера.Рекомендуемая практика!
  3. Вам также не нужно определение службы для PatternsController.

Примечание. В Symfony 4 больше не следует использовать «связки», чтобы я мог избавиться от них.из AnalyticsBundle.

Примечание. Лучше упорядочить файлы конфигурации, как показано здесь: Организация файлов конфигурации маршрута, службы и параметров в приложениях Symfony 4 .

Этого должно быть достаточно:

services.yaml

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

    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,....so on .....,Kernel.php}'

    App\Controller\:
        resource: '../../src/Regions/AnalyticsBundle/Controller'
        tags: ['controller.service_arguments']

PatternsController

namespace Regions\AnalyticsBundle\Controller;

use Regions\AnalyticsBundle\Service\PatternCacheService;

class PatternsController
{
    private $pcs;

    public function __construct(PatternCacheService $pcs)
    {
        $this->pcs = $pcs;
    }
}
0 голосов
/ 25 июня 2018

Вы забыли use в вашем контроллере, заставляя PHP думать, что ваш сервис находится в том же пространстве имен, что и ваш контроллер.

<?php

namespace Regions\AnalyticsBundle\Controller;

use Regions\AnalyticsBundle\Service\PatternCacheService;

class PatternsController extends BaseController
{

    private $pcs;

    public function __construct(PatternCacheService $pcs)
    {
        $this->pcs = $pcs;
    }
}

Это на самом деле было вызвано как часть вашего сообщения об ошибке

Аргумент 1 передается в Regions \ AnalyticsBundle \ Controller \ PatternsController :: __ construct () должен быть экземпляром Regions \ AnalyticsBundle \ Controller \ PatternCacheService

Когдавы ожидали, что вашему контроллеру понадобится экземпляр Regions\AnalyticsBundle\Service\PatternCacheService

...