Использование DI с контроллером Symfony - PullRequest
0 голосов
/ 07 ноября 2018

Я ищу конкретный пример реализации DI с контроллерами Symfony ... https://symfony.com/doc/3.4/controller/service.html не сильно помог.

Config

search_service:
    class:        Acme\MyBundle\Services\SearchService

search_controller:
    class:        Acme\MyBundle\Controller\SearchController
    arguments:    ['@search_service']

Контроллер

// Acme/MyBundle/Controllers/SearchController.php

class SearchController extends Controller
{
    public function __construct(SearchService $searchService)
    {
        $this->searchService = $searchService;
    }
}

Дает мне:

Type error: Argument 1 passed to Acme\\MyBundle\\Controller\\SearchController::__construct() must be an instance of Acme\\MyBundle\\Services\\SearchService, none given

Любая помощь приветствуется:)

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Мне пришлось внести следующие изменения, чтобы он заработал для моей установки 3.4:

Изменить относительный путь ресурса

Acme\MyBundle\Controller\:
    resource: '../../Controller'
    tags: ['controller.service_arguments']

Измените 'имя' контроллера на полное имя класса

Acme\MyBundle\Controller\SearchController:
    class:        Acme\MyBundle\Controller\SearchController
    arguments:    ['@search_service']
0 голосов
/ 07 ноября 2018

Ваш контроллер не работает, потому что у вас нет пространства имен . Поэтому в начале добавьте правильное пространство имен, но все еще будет проблематично вводить параметры с помощью ручного подключения, поскольку вы расширяете базовый контроллер.

Лучше просто использовать автопроводку, при этом вам не нужно будет определять свои зависимости из services.yml, и он будет легко работать с контроллерами.

Вот пример

  # app/config/services.yml
services:
    # default configuration for services in *this* file
    _defaults:
        # automatically injects dependencies in your services
        autowire: true
        # automatically registers your services as commands, event subscribers, etc.
        autoconfigure: true
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to do this, you can override this setting on individual services
        public: false

    # makes classes in src/AppBundle available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    AppBundle\:
        resource: '../../src/AppBundle/*'
        # you can exclude directories or files
        # but if a service is unused, it's removed anyway
        exclude: '../../src/AppBundle/{Entity,Repository}'

    # controllers are imported separately to make sure they're public
    # and have a tag that allows actions to type-hint services
    AppBundle\Controller\:
        resource: '../../src/AppBundle/Controller'
        tags: ['controller.service_arguments']

пс. Кроме того, я рекомендую вообще не расширять базовый контроллер, потому что таким образом вы получаете слишком много зависимостей, которые вам на самом деле не нужны. Лучше получить ветку, услуги и все, что вам нужно, подключив их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...