Symfony 4 не работает сервис контейнер

101
06 мая 2021, 08:50

Создаю сервисный класс App\Http\OpenWeather Пишу в services.yml типа того

openweather:
        class: App\Http\OpenWeather

ну и в контроллере пытаюсь использовать

$weatherService = $this->container->get('openweather');

на что получаю ошибку

Service "openweather" not found: even though it exists in the app's container, the container inside "App\Controller\WeatherController" is a smaller service locator that only knows about the "http_kernel", "parameter_bag", "request_stack", "router" and "session" services. Try using dependency injection instead.

пробовал так же просто вписывать имя класса как аргумент метода типа

public function weather(Request $request, OpenWeather $weatherService)

На это получил ошибку

Cannot determine controller argument for "App\Controller\WeatherController::weather()": the $weatherService argument is type-hinted with the non-existent class or interface: "App\Http\OpenWeather".

пробовал просто создать экземпляр

$weatherService = new OpenWeather();

и тут ошибка

Attempted to load class "OpenWeather" from namespace "App\Http". Did you forget a "use" statement for another namespace?

хотя я использовал use

Как мне все же использовать нужный мне класс в симфони как сервис?

P.S. Произошло необьяснимое - переименовал класс OpenWeather в Weather и заработал use и автовайринг. Но вот контейнер не работает все равно

Answer 1

В symfony 4.2 поддерживается автоматическая регистрация, внедрение и оптимизация Ваших сервисов. Пример конфига config/services.yaml:

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.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.
    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
    # ...

данная конфигурация делает классы в src/ доступными для использования в качестве сервисов

И побольшому счету Вам нужно создать сервис

namespace App\Service;

class OpenWeather {
...
}

Импортировать в каком-нибудь контроллере сервис и вызвать в экшене.

use App\Service\OpenWeather
class HomeController {
   private $openWeather;
   public __constructor(OpenWeather $openWeather) {
        $this->openWeather = $openWeather;
   }
   public function weather() {
       $this->openWeather->getWeather();
 ...
   } 
}
READ ALSO
Сменить раскладку на противоположную

Сменить раскладку на противоположную

Никак не пойму, как сменить раскладку текста - не на "правильную" - просто на противоположнуюДелаю так, но всегда раскладка остается русской:

86
Передача результата функции в качестве параметра объекту

Передача результата функции в качестве параметра объекту

Прошу помочь с учебным заданием по главе "Интерфейсы":

101
Постеры к видео

Постеры к видео

Как в php 7 загрузить видео и сразу же сделать скирншот видео по середине видео и сохранить его(создать постер к видео) без сторонних ffmepg и тп

92