услуга связки (autowire) недоступна в методе контроллера - PullRequest
0 голосов
/ 24 апреля 2020

Я бы хотел использовать https://github.com/tedious/TedivmStashBundle в моем проекте symfony 4. Добавлен composer, настроен в / config / sta sh .yaml и, в соответствии со строкой профилировщика, работает в основном.

Теперь я хочу использовать для кэширования значений в моем контроллере. Я пытаюсь добавить службу sta sh по ее имени к параметру метода, используя то же имя, что и в примере:

$pool = $this->container->get('stash');

, но фреймворк не нашел сервис. Его нельзя добавить, как объяснил пример.

Как я могу использовать этот пакет в качестве службы (с автосвязью) в моем приложении symfony 4?

ОБНОВЛЕНИЕ

services.yaml:

  stash.default_cache:
    class: Tedivm\StashBundle\Service\CacheService
    public: true
    arguments:
      $name: 'stash'

  Tedivm\StashBundle\Service\CacheService: '@stash.default_cache'

Контроллер:

public function something(Request $request, CacheService $service, ...

Это похоже на работу сейчас:)

Спасибо за предложение (и правильное решение позже) до @ Cerad

1 Ответ

2 голосов
/ 24 апреля 2020

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

Начните с установки тестового проекта:

symfony new --full stash --version=lts
composer require tedivm/stash-bundle

Примечание что связка напрямую не поддерживает Symfony 5, следовательно, lts. Также обратите внимание, что пакеты не поддерживают Flex, поэтому вы должны добавить свой собственный файл config / packages / sta sh .yaml для файла readme пакета.

# config/packages/stash.yaml
stash:
  drivers: [ FileSystem ]
  FileSystem: ~

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

bin/console debug:container stash
Information for Service "stash.default_cache"
=============================================

 Class CacheService

 ---------------- ----------------------------------------- 
  Option           Value                                    
 ---------------- ----------------------------------------- 
  Service ID       stash.default_cache                      
  Class            Tedivm\StashBundle\Service\CacheService  

Большую часть времени вы хотели бы использовать интерфейс для внедрения, но взгляд на исходный код показывает, что пакет не использует интерфейсы. Как примечание, называть стороннюю службу «sta sh» не очень хорошая идея. Это действительно должно было быть 'tedivm.sta sh', но я отвлекся.

Теперь мы можем создать псевдоним и напечатать на него:

# config/services.yaml
    Tedivm\StashBundle\Service\CacheService : '@stash' # alias for typehinting

# Controller class
    public function index(CacheService $cacheService)
    {
        return new Response('Cache ' . get_class($cacheService));
    }

И это должно сработать.

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