Symfony4 использует внешнюю библиотеку классов в качестве службы - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть небольшая внешняя библиотека, которая предоставляет множество классов.

В моем проекте symfony4 я хотел бы объявить свой класс от поставщика как сервис с autowire и public. Поэтому я включил мою библиотеку с помощью composer и добавил конфигурацию psr, например, в composer.json:

"autoload": {
        "psr-4": {
            "App\\": "src/",
            "ExternalLibrary\\": "vendor/external-library/api/src/"
        }
    }

После этого я попытался изменить свои services.yaml на symfony следующим образом:

ExternalLibrary\:
    resource: '../vendor/external-library/api/src/*'
    public: true
    autowire: true

Если я запускаю тесты или запускаю приложение, я получаю эту ошибку:

Cannot autowire service "App\Domain\Service\MyService": argument "$repository" of method "__construct()" references interface "ExternalLibrary\Domain\Model\Repository" but no such service exists. You should maybe alias this interface to the existing "App\Infrastructure\Domain\Model\MysqlRepository" service.

Если я добавлю в services.yaml интерфейс, это будет нормально работать:

ExternalLibrary\Domain\Model\Lotto\Repository:
    class: '../vendor/external-library/api/src/Domain/Model/Repository.php'
    public: true
    autowire: true

Но у меня много классов, и я не хочу объявлять каждый класс, как я могу исправить services.yaml без объявления каждого отдельного сервиса?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Давайте возьмем Dompdf в качестве примера:

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

Итак, чтобы решить эту проблему, мы внесем небольшое изменение в наш файл services.yaml, добавив этот короткий конфиг

Dompdf\: #Add the global namespace
   resource: '../vendor/dompdf/dompdf/src/*' #Where can we find your external lib ?
   autowire: true  #Turn autowire to true

Применим приведенный выше пример ко всем внешним PHP-библиотекам :)

Вот и все!

0 голосов
/ 04 сентября 2018

Вам необходимо создавать услуги вручную: Я не проверял, но это должно выглядеть так

services.yaml

Some\Vendor\:
    resource: '../vendor/external-library/api/src/*'
    public: true # should be false

Some\Vendor\FooInterface:
    alias: Some\Vendor\Foo # Interface implementation

Some\Vendor\Bar:
    class: Some\Vendor\Bar
    autowire: true

PHP

<?php

namespace Some\Vendor;

class Foo implements FooInterface
{

}

class Bar
{
    public function __construct(FooInterface $foo)
    {

    }
}

Точнее, у вас должно быть что-то вроде

ExternalLibrary\Domain\Model\Repository:
    alias: App\Infrastructure\Domain\Model\MysqlRepository
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...