Skip to content

Commit

Permalink
added a micro kernel
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Nov 4, 2015
1 parent 69af9ea commit eab0f0a
Show file tree
Hide file tree
Showing 3 changed files with 191 additions and 0 deletions.
87 changes: 87 additions & 0 deletions src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php
@@ -0,0 +1,87 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\FrameworkBundle\Kernel;

use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Routing\RouteCollectionBuilder;

/**
* A Kernel that provides configuration hooks.
*
* @author Ryan Weaver <ryan@knpuniversity.com>
* @author Fabien Potencier <fabien@symfony.com>
*/
trait MicroKernelTrait
{
/**
* Add or import routes into your application.
*
* $routes->import('config/routing.yml');
* $routes->add('/admin', 'AppBundle:Admin:dashboard', 'admin_dashboard');
*
* @param RouteCollectionBuilder $routes
*/
abstract protected function configureRoutes(RouteCollectionBuilder $routes);

/**
* Configures the container.
*
* You can register extensions:
*
* $c->loadFromExtension('framework', array(
* 'secret' => '%secret%'
* ));
*
* Or services:
*
* $c->register('halloween', 'FooBundle\HalloweenProvider');
*
* Or parameters:
*
* $c->setParameter('halloween', 'lot of fun');
*
* @param ContainerBuilder $c
* @param LoaderInterface $loader
*/
abstract protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader);

/**
* {@inheritdoc}
*/
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(function (ContainerBuilder $container) use ($loader) {
$container->loadFromExtension('framework', array(
'router' => array(
'resource' => 'kernel:loadRoutes',
'type' => 'service',
),
));

$this->configureContainer($container, $loader);

$container->addObjectResource($this);
});
}

/**
* @internal
*/
public function loadRoutes(LoaderInterface $loader)
{
$routes = new RouteCollectionBuilder($loader);
$this->configureRoutes($routes);

return $routes->build();
}
}
@@ -0,0 +1,71 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\FrameworkBundle\Tests\Kernel;

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

class ConcreteMicroKernel extends Kernel
{
use MicroKernelTrait;

private $cacheDir;

public function halloweenAction()
{
return new Response('halloween');
}

public function registerBundles()
{
return array(
new FrameworkBundle(),
);
}

public function getCacheDir()
{
return $this->cacheDir = sys_get_temp_dir().'/sf_micro_kernel';
}

public function getLogDir()
{
return $this->cacheDir;
}

public function __destruct()
{
$fs = new Filesystem();
$fs->remove($this->cacheDir);
}

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

protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
{
$c->loadFromExtension('framework', array(
'secret' => '$ecret',
));

$c->setParameter('halloween', 'Have a great day!');
$c->register('halloween', 'stdClass');
}
}
@@ -0,0 +1,33 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\FrameworkBundle\Tests\Kernel;

use Symfony\Component\HttpFoundation\Request;

class MicroKernelTraitTest extends \PHPUnit_Framework_TestCase
{
/**
* @requires PHP 5.4
*/
public function test()
{
$kernel = new ConcreteMicroKernel('test', true);
$kernel->boot();

$request = Request::create('/');
$response = $kernel->handle($request);

$this->assertEquals('halloween', $response->getContent());
$this->assertEquals('Have a great day!', $kernel->getContainer()->getParameter('halloween'));
$this->assertInstanceOf('stdClass', $kernel->getContainer()->get('halloween'));
}
}

0 comments on commit eab0f0a

Please sign in to comment.