(Symfony 4) Невозможно получить доступ к классу, установленному в папке моего поставщика

Я установил пакет Liip, и класс, который мне нужен, явно доступен в моем контейнере, так как вот результаты моей команды debug:container:

$ bin/console debug:container
liip_imagine.service.filter       Liip\ImagineBundle\Service\FilterService

Просто чтобы показать вам, что это там, вот изображение моей структуры папок:

(Symfony 4) Невозможно получить доступ к классу, установленному в папке моего поставщика

Вот код, который я использую для доступа к нему в моем контроллере:

public function saveProfileEditAction(Request $request)
{
    $user = $this->getUser();
    $imagine = $this
        ->container
        ->get('liip_imagine.service.filter');

Вот ошибка, которую я получаю:

The "liip_imagine.service.filter" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.

Думаю, мне нужно знать, как сделать это публичным?

Вот как выглядит мой файл yaml:

liip_imagine :
    # configure resolvers
    resolvers :
        # setup the default resolver
        default :
            # use the default web path
            web_path : ~
    # your filter sets are defined here
    filter_sets :
        # use the default cache configuration
        cache : ~
        # the name of the "filter set"
        my_thumb :
            # adjust the image quality to 75%
            quality : 75
            # list of transformations to apply (the "filters")
            filters :
                # create a thumbnail: set size to 120x90 and use the "outbound" mode
                # to crop the image when the size ratio of the input differs
                thumbnail  : { size : [120, 90], mode : outbound }
                thumb_square :  { size : [300, 300], mode : outbound }
                thumb_rectangle_md : { size : [670, 400], mode : outbound }
                thumb_hd : { size : [1920, 1080], mode : outbound }
                # create a 2px black border: center the thumbnail on a black background
                # 4px larger to create a 2px border around the final image
                background : { size : [124, 94], position : center, color : '#000000' }

Похоже, ваша IDE не распознает пространства имен классов. Я говорю о красных буквах и желтой подсветке. Убедитесь, что вы запустили установку композитора и правильно настроили файл автозагрузки.

Domagoj 24.02.2019 09:10

Скорее всего сервис не является публичным, поэтому его нельзя получить из контейнера. Это поведение по умолчанию, чтобы отговорить людей от чрезмерного использования ContainerAware, поскольку это считается плохой практикой. Вы можете проверить, добавив название сервиса в debug:container или использовать debug:autowiring (я думаю).

dbrumann 24.02.2019 10:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
714
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это касается части «или» вашей ошибки. Вы можете использовать внедрение зависимостей Symfony следующим образом:

в контроллере:

public function saveProfileEditAction(Request $request, FilterService $imagine) // Typehint service to controller method (remember to `use` on the top of the file)
{
    $user = $this->getUser();
    $imagine->...; // Use it

В services.yml зарегистрируйте свой контроллер как сервис и пометьте его, чтобы symfony знал, что ему нужно внедрить в него сервисы.

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    YourNamespace/*Bundle/Controller/YourController: // Change this
        tags: [ 'controller.service_arguments' ]

https://symfony.com/doc/current/service_container.html#service-container-services-load-example

Привет Домагой, спасибо за ваш ответ. Знаете ли вы синтаксис для указания аргументов? Я перешел к symfony.com/doc/current/controller/service.html, и он не дает примера указания запроса в качестве аргумента службы.

Brent Heigold 24.02.2019 09:36

Вам не нужно беспокоиться об этом. Symfony знает, что делать. Вам нужно только пометить свой контроллер controller.service_arguments. Я также добавил часть для конфигурации _defaults. Установите для параметров autowire и autoconfigure значение true

Domagoj 24.02.2019 09:45

Когда вы настраиваете проект на Symfony 4, контроллеры уже должны иметь этот тег и разрешать это. В качестве альтернативы вы можете просто внедрить службу в контроллер с помощью внедрения конструктора или, если вы используете AbstractController, перезаписать public static getSubscribedServices-массив, сделав службу доступной. Для этого просто проверьте AbstractController + ControllerTrait, где вы можете увидеть, как это делается для служб по умолчанию, таких как twig.

dbrumann 24.02.2019 09:57

Привет, Домагой, похоже, это сработало. Мне также пришлось добавить это в мой файл services.yaml: Liip\ImagineBundle\Service\FilterService: '@liip_imagine.service.filter'

Brent Heigold 24.02.2019 13:19

Я как раз собирался тебе это сказать. Рад, что это работает. :)

Domagoj 24.02.2019 13:19

Другие вопросы по теме