mcek
mcek

Reputation: 490

Symfony 3.4 microkernel custom services

I wonder if possible to register custom service in symfony 3.4 MicroKernel app directly from AppKernel class by configureContainer method instead of loading all services from service.yml file.

Maybe by ContainerBuilder loadFromExtension method?

...

class AppKernel extends Kernel
{
    use MicroKernelTrait;

    public function registerBundles()
    {
       ...
    }

   protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config.yml');

        $c->loadFromExtension('custom_service', [
            ...
        ]);
    }

   ...
}

Upvotes: 0

Views: 376

Answers (1)

Gander
Gander

Reputation: 2001

Working example:

<?php

use App\LoremIpsum;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Routing\RouteCollectionBuilder;

require_once __DIR__ . '/../vendor/autoload.php';

class AppKernel extends Kernel {
    use MicroKernelTrait;

    public function registerBundles() {
        return [
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        ];
    }

    protected function configureRoutes(RouteCollectionBuilder $routes) {
        $routes->add('/', 'kernel:exampleAction');
    }

    protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader) {
        $c->loadFromExtension('framework', [
            'secret' => 'r0tf1.XD',
        ]);

        $c->register(LoremIpsum::class)->setArguments([123, 'ABC'])->setPublic(true);
    }

    public function exampleAction() {
        $obj = $this->getContainer()->get(LoremIpsum::class);
        return Response::create((string)$obj);
    }
}

$kernel   = new AppKernel('dev', true);
$request  = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

See also: http://symfony.com/doc/3.4/service_container/definitions.html

Upvotes: 1

Related Questions