Я установил пакет Liip, и класс, который мне нужен, явно доступен в моем контейнере, так как вот результаты моей команды debug:container:
$ bin/console debug:container
liip_imagine.service.filter Liip\ImagineBundle\Service\FilterService
Просто чтобы показать вам, что это там, вот изображение моей структуры папок:
Вот код, который я использую для доступа к нему в моем контроллере:
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' }
Скорее всего сервис не является публичным, поэтому его нельзя получить из контейнера. Это поведение по умолчанию, чтобы отговорить людей от чрезмерного использования ContainerAware, поскольку это считается плохой практикой. Вы можете проверить, добавив название сервиса в debug:container или использовать debug:autowiring (я думаю).




Это касается части «или» вашей ошибки. Вы можете использовать внедрение зависимостей 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, и он не дает примера указания запроса в качестве аргумента службы.
Вам не нужно беспокоиться об этом. Symfony знает, что делать. Вам нужно только пометить свой контроллер controller.service_arguments. Я также добавил часть для конфигурации _defaults. Установите для параметров autowire и autoconfigure значение true
Когда вы настраиваете проект на Symfony 4, контроллеры уже должны иметь этот тег и разрешать это. В качестве альтернативы вы можете просто внедрить службу в контроллер с помощью внедрения конструктора или, если вы используете AbstractController, перезаписать public static getSubscribedServices-массив, сделав службу доступной. Для этого просто проверьте AbstractController + ControllerTrait, где вы можете увидеть, как это делается для служб по умолчанию, таких как twig.
Привет, Домагой, похоже, это сработало. Мне также пришлось добавить это в мой файл services.yaml: Liip\ImagineBundle\Service\FilterService: '@liip_imagine.service.filter'
Я как раз собирался тебе это сказать. Рад, что это работает. :)
Похоже, ваша IDE не распознает пространства имен классов. Я говорю о красных буквах и желтой подсветке. Убедитесь, что вы запустили установку композитора и правильно настроили файл автозагрузки.