Skip to content
Advertisement

Symfony4 use external class library as a service

I have a little external library that expose many classes.

Into my symfony4 project I would like to declare my class from vendor, as a service with autowire and public. So I have include my library with composer and add psr configuration like this into composer.json:

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

After that I have tried to change my services.yaml into symfony like this:

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

If I launch tests or run the application returns me this error:

Cannot autowire service "AppDomainServiceMyService": argument "$repository" of method "__construct()" references interface "ExternalLibraryDomainModelRepository" but no such service exists. You should maybe alias this interface to the existing "AppInfrastructureDomainModelMysqlRepository" service.

If I declare into services.yaml the interface this works fine:

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

But I have many classes and I don’t want to declare each class, how can I fix services.yaml without declare every single service?

Thanks

Advertisement

Answer

You need to create services by hand: I did not test it but it should look like this

services.yaml

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

SomeVendorFooInterface:
    alias: SomeVendorFoo # Interface implementation

SomeVendorBar:
    class: SomeVendorBar
    autowire: true

php

<?php

namespace SomeVendor;

class Foo implements FooInterface
{

}

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

    }
}

To be more precise you should have something like

ExternalLibraryDomainModelRepository:
    alias: AppInfrastructureDomainModelMysqlRepository
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement