I am trying the new automatic service loading using Symfony's Dependency Injection component (stand-alone, not within a Symfony app), version v3.3.13
.
If I manually define a service, the class is loaded correctly:
# services.yml
myasset:
class: Mysite\Asset\Asset
# in a PHP file
$container->get('myasset'); # works
If I set up automatic loading, it fails with the error message: ReflectionException: Class does not exist in /var/www/vendor/symfony/dependency-injection/ContainerBuilder.php on line 1070
# services.yml
_defaults:
autowire: true
autoconfigure: true
public: false
Bloggi\:
resource: '../src/*'
public: true
# in a PHP file
$container->get(Mysite\Asset\Asset::class);
The reason it fails is because the classes are found and service definitions created, but the class
attribute on the definition is null
for the automatically loaded services.
My DIC configuration looked like:
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(__DIR__));
$loader->load(__DIR__ . '/../config/services.yml');
The missing line was $container->compile();
The working definition
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(__DIR__));
$loader->load(__DIR__ . '/../config/services.yml');
$container->compile();