Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MicroKernel aneb špatný název pro Helper (5. sraz přátel Symfony)

Martin Zeman
February 23, 2016

MicroKernel aneb špatný název pro Helper (5. sraz přátel Symfony)

MicroKernel (aneb špatný název pro Helper).
Žhavá novinka. Vyplatí se jí používat?

Martin Zeman

February 23, 2016
Tweet

More Decks by Martin Zeman

Other Decks in Programming

Transcript

  1. Anglický název kernel znamená (v překladu): • jádro pecky •

    zrno • ztvrdlá dužina ovoce https://cs.wikipedia.org/wiki/Jádro_operačního_systému
  2. Jádro operačního systému (anglicky kernel) je v informatice část operačního

    systému, která je zavedena do operační paměti při startu (bootování) počítače a je jí předáno řízení. U pokročilých operačních systémů jádro nikdy neztrácí kontrolu nad počítačem a po celou dobu jeho běhu koordinuje činnost všech spuštěných procesů. Bla bla bla ... https://cs.wikipedia.org/wiki/Jádro_operačního_systému
  3. Mikrojádro je v informatice typ jádra operačního systému, které je

    velmi malé a obsahuje jen nejzákladnější funkce (typicky správu paměti a podporu pro plánování procesů a meziprocesové komunikace), čímž se minimalizuje objem běžícího kódu v privilegovaném režimu. Bla bla bla ... https://cs.wikipedia.org/wiki/Mikrojádro
  4. MicroKernel (Symfony kernel) N O VIN K A !!! v

    2.8 + http://symfony.com/blog/new-in-symfony-2-8-symfony-as-a-microframework https://knpuniversity.com/screencast/new-in-symfony3/micro-kernel
  5. // vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php trait MicroKernelTrait { abstract protected function configureRoutes (RouteCollectionBuilder

    $routes); abstract protected function configureContainer (ContainerBuilder $c, LoaderInterface $loader); public function registerContainerConfiguration (LoaderInterface $loader) { $loader->load( function (ContainerBuilder $container) use ($loader) { $container->loadFromExtension ('framework' , [ 'router' => [ 'resource' => 'kernel:loadRoutes' , 'type' => 'service' ] ] ); $this->configureContainer ($container, $loader); $container->addObjectResource ($this); } ); } public function loadRoutes(LoaderInterface $loader) { $routes = new RouteCollectionBuilder( $loader); $this->configureRoutes ($routes); return $routes->build(); } } Ano, Trait je malý, ale to je asi vše...
  6. // index.php class LittleKernel extends Kernel { use MicroKernelTrait; public

    function registerBundles() { return [ new FrameworkBundle() ]; } protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader) { $c->loadFromExtension('framework', ['secret' => 'James Bond 007']); } protected function configureRoutes(RouteCollectionBuilder $routes) { $routes->add('/hello/{name}', 'Kernel:helloAction'); } public function helloAction($name) { return new Response("Hello $name"); } } $kernel = new LittleKernel('dev', true); $kernel->loadClassCache(); $kernel->handle(Request::createFromGlobals())->send(); A přidat pár řádků do index.php
  7. // index.php class LittleKernel extends Kernel { use MicroKernelTrait; public

    function registerBundles() { return [ new FrameworkBundle(), ]; } protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader) { $c->loadFromExtension('framework', ['secret' => 'James Bond 007']); } protected function configureRoutes(RouteCollectionBuilder $routes) { $routes->add('/hello/{name}', 'Kernel:helloAction'); } public function helloAction($name) { return new Response("Hello $name"); } } $kernel = new LittleKernel('dev', true); $kernel->loadClassCache(); $kernel->handle(Request::createFromGlobals())->send(); "Hello $name" A přidat pár řádků do index.php
  8. // index.php class LittleKernel extends Kernel { ... public function

    registerBundles () { return [ new FrameworkBundle() , new TwigBundle() ]; } protected function configureContainer (ContainerBuilder $c, LoaderInterface $loader) { $c->loadFromExtension ( 'framework' , [ 'secret' => 'James Bond 007' , 'templating' => ['engines' => ['twig']] ] ); } ... public function helloAction ($name) { $twig = $this->getContainer ()->get('twig'); $template = $twig->createTemplate ('Hello {{ name }}' ); $html = $template->render(['name' => $name]); return new Response($html); } } ... 'Hello {{ name }}'
  9. // src/AppBundle/AppBundle.php <?php namespace AppBundle; use Symfony\Component\HttpKernel\Bundle\Bundle ; class AppBundle

    extends Bundle { } // src/AppBundle/Controller/MController.php <?php namespace AppBundle\Controller ; use Symfony\Bundle\FrameworkBundle\Controller\Controller ; class MController extends Controller { public function helloAction($name) { return $this->render('AppBundle:M:hello.html.twig' , ['name' => $name]); } } // src/AppBundle/Resources/views/M/hello.html.twig Hello {{ name }}
  10. // index.php class LittleKernel extends Kernel { use MicroKernelTrait ;

    public function registerBundles () { return [ new FrameworkBundle() , new TwigBundle() , new AppBundle() , ]; } protected function configureContainer (ContainerBuilder $c, LoaderInterface $loader) { $c->loadFromExtension ( 'framework' , [ 'secret' => 'James Bond 007' , 'templating' => ['engines' => ['twig']] ] ); } protected function configureRoutes (RouteCollectionBuilder $routes) { $routes->add('/hello/{name}' , 'AppBundle:M:hello' ); } } ...
  11. { "require": { "symfony/framework-bundle": "3.0.*", "symfony/twig-bundle": "3.0.*", "sensio/framework-extra-bundle": "3.0.*" },

    "autoload": { "psr-4": { "": "src/" } } } Pro použití stačí jen stáhnout sensio/framework-extra-bundle
  12. // src/AppBundle/Controller/MController.php class MController extends Controller { /** * @Route("/hello/{name}")

    * @Template() */ public function helloAction($name) { return ['name' => $name]; } }
  13. // index.php $loader = require __DIR__ . '/vendor/autoload.php' ; AnnotationRegistry::

    registerLoader([$loader, 'loadClass' ]); class LittleKernel extends Kernel { use MicroKernelTrait ; public function registerBundles () { return [ new FrameworkBundle() , new TwigBundle() , new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle() , new AppBundle() , ]; } ... protected function configureRoutes (RouteCollectionBuilder $routes) { $routes->import('@AppBundle/Controller' , '/', 'annotation' ); } } ...
  14. // index.php use Doctrine\Common\Annotations\AnnotationRegistry; use Symfony\Component\HttpFoundation\Request; $loader = require __DIR__

    . '/vendor/autoload.php'; AnnotationRegistry::registerLoader([$loader, 'loadClass']); require __DIR__ . '/LittleKernel.php'; $kernel = new LittleKernel('dev', true); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);
  15. <?php // LittleKernel.php ... class LittleKernel extends Kernel { use

    MicroKernelTrait ; public function registerBundles () { return [ new FrameworkBundle() , new TwigBundle() , new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle() , new AppBundle() , ]; } protected function configureContainer (ContainerBuilder $c, LoaderInterface $loader) { $c->loadFromExtension ( 'framework' , [ 'secret' => 'James Bond 007' , 'templating' => ['engines' => ['twig']] ] ); } protected function configureRoutes (RouteCollectionBuilder $routes) { $routes->import('@AppBundle/Controller' , '/', 'annotation' ); } }
  16. +1