Symfony po krůčkách – MicroKernel

V dnešním díle seriálu Symfony po krůčkách se zaměříme na novinku, a to MicroKernel. Symfony tak bude menší, svižnější, ale přitom pořád full stack. Můžeme tedy konečně říci, že i Symfony je microframework!
Seriál: Symfony po krůčkách (18 dílů)
- Symfony po krůčkách – Routing 1. 2. 2016
- Symfony po krůčkách – MicroKernel 9. 2. 2016
- Konfigurujeme Symfony pomocí YAMLu 16. 2. 2016
Nálepky:
Symfony od verze 3.0 (2.8) obsahuje nově trait MicroKernel, který ti na menších “projektech” výrazně zjednodušší práci. Už si nemusíš lámat hlavu s tím, jestli projekt psát v Symfony nebo ne, prostě to udělej! Důvody typu “Je to zbytečně moc velké” jsou ty tam.
Představ si, že ti klient zadá microweb, který má mít 3 stránky: Homepage, O firmě a Kontakt. Můžeš to napsat v čistém HTML, Silexu nebo Slimu. Ale co když klient bude každý měsíc posílat nové požadavky na úpravy a web se bude postupně rozrůstat třeba do formy eShopu? Není pak jednodušší rovnou použít lightweight Symfony a zjednodušit si do budoucna život? Je!
Výhody oproti Silexu (nebo Slimu)
- full stack
- lze jednoduše přejít na klasické Symfony
- Twig
- Anotace v kontrolerech (@Route, @Method, @Template…)
- možnost použití bundlů, které máš rád
Srovnání s klasickým Symfony, Silexem a Slimem
Počet souborů | Celková velikost | |
Symfony 3.0 full stack | 8.200 | 48 MB |
Symfony 3.0 MicroKernel | 7.000 | 39 MB |
Silex | 825 | 4,2 MB |
Slim | 225 | 1,3 MB |
Do srovnání jsem zahrnul navic i Silex a Slim, který je sice hubený, ale neobsahuje Twig.
Proč raději MicroKernel a ne full stack?
Z tabulky je patrné, že Symfony MicroKernel není o moc menší a neobsahuje ani o moc méně souborů než klasické Symfony, tak proč bych ho měl používat? Především kvůli rychlosti. A to jak rychlosti zpracování požadavků (méně bundlů = větší rychlost), ale i kvuli rychlosti vývoje. Na výše zmíněném mini webu pro klienta, který chce jen tři stránky, si to v příštím článku ukážeme. A ještě si k tomu přidáme kontaktní formulář!
Pojďme si to zkusit!
Vše zkouším na PHP 7 a Symfony 3.
Nejdříve si vytvoříme nějakou složku, třeba SymfonyMicroKernel, a v ní spustíme instalaci Symfony pomocí Composeru (pokud nevíš, co je Composer, tak se to honem rychle douč, tvůj život dostane nový smysl).
composer require "symfony/symfony:^3.0"
V minimalismu je síla
Udělejme si „Hello, world!“ v jednom souboru (index.php).
<?php
// index.php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Routing\RouteCollectionBuilder;
use Symfony\Component\HttpFoundation\Request;
class MicroKernel extends Kernel
{
use MicroKernelTrait;
public function registerBundles()
{
return [new Symfony\Bundle\FrameworkBundle\FrameworkBundle()];
}
protected function configureRoutes(RouteCollectionBuilder $routes)
{
$routes->add('/', 'kernel:indexAction', 'homepage');
$routes->add('/hello/{name}', 'kernel:indexAction', 'index');
}
protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
{
$c->loadFromExtension('framework', ['secret' => 'ThisTokenIsNotSoSecretChangeIt']);
}
public function indexAction($name = "Fantomas")
{
return new Response(sprintf('Hello, %s!', $name));
}
}
$app = new MicroKernel('dev', true);
$app->loadClassCache();
$app->handle(Request::createFromGlobals())->send();
Nezapomeň, že Symfony bude chtít vytvořit složky cache a logs (přímo v rootu) a bude do nich chtít zapisovat. Návod na nastavení najdeš v dokumentaci.
Tímto jsi vytvořil první „Hello, World!“ appku. Otevři si v prohlížeči index.php/hello/Dennis a uvidíš “Hello, Dennis!”.

Hello, Symfony!
Závěrem
Jak jsem napsal na Symfony blogu, myslím si, že MicroKernel znamená smrt pro Silex, který už nyní poněkud umírá.
V příštím článku se podíváme, jak obléknout MicroKernel do Symfony struktury a vytvoříme si miniweb pro našeho fiktivního klienta.
MicroKernel je ideální pro začátečníky. Nebojte si hrát :-)
Děkuji Tomášovi za cenné rady při psaní mého prvního článku.
Kdyz jsem si to zkousel, tak nefunguje routa do rootu /. Pokud prohodim jejich poradi v souboru, zase nefunguje ta druha.
Fatal error: Uncaught exception ‚Symfony\Component\Routing\Exception\ResourceNotFoundException‘ in symfonyMicroKernel\cache\dev\symfonyMicroKernelDevUrlMatcher.php:39 Stack trace: #0
Problem je v tom, ze jsou obe ty routy stejne pojmenovane, rekl bych.
Ahoj Honzo, bohuzel mas pravdu, routy jsou pojmenovane stejne – chybicka se vloudila :)
Kluci (a doufam ze i holky), fungovalo by to i se „symfony/framework-bundle“, nicmene vzhledem k tomu, ze v dalsim dile bude potreba Twig, pouzil jsem rovnou „symfony/symfony“. Pokud by se pouzil jen FrameworkBundle, tak by to melo jen 2.063 souboru :-)
Do tridy MicroKernel lze take implementovat sys_get_tmp_dir(), pak se nemusi nastavovat prava na logs a cache adresar (a pouzije se tmp adresar systemu).
public function getCacheDir() { return sys_get_temp_dir(); } public function getLogDir() { return sys_get_temp_dir(); }
Ahoj, díky za článek, MicroKernel je určitě velký krok kupředu. Dost často pro AJAXové operace vytvářím malé single-file aplikace, které využívají jen některé komponenty (Yaml::parse na konfigurace parameters.yml, Request, JsonResponse a připojení do databáze). Díky tomu šetřím prostředky serveru a rychlost odezvy je opravdu jinde.
Co mě ale zajímá…. Už jste někdo zkoušel použít MicroKernel společně s klasickým full-stackem? To znamená, že hlavní aplikace zůstane, ale pouze určité operace (které nevyžadují inicializaci všech bundlů) se budou provádět přes MicroKernel …. určitě by šlo přes .htaccess přesměrovat část na MicroKernel a zbytek na klasický :-)
Ahoj, je to mozne :) Koukni se na slajdy z prednasky (od snimku 71).
http://www.slideshare.net/weaverryan/symfony-your-next-microframework-symfonycon-2015