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