4 žhavé novinky v Symfony 3

V listopadu 2015 má kromě PHP 7 a Drupalu 8 vyjít i Symfony 3. V tomto článku se dozvíte, kdy vyjde která verze a jaký bude jejich praktický dopad, a také jaké jsou 4 nejzajímavější novinky.
Článek původně vyšel na autorově blogu.
Symfony už toho umí opravdu hodně, nová verze klade velký důraz především na DX (developer experience). Přináší nám jednodušší a jednoznačné API, lepší decoupling komponent, integraci standardů PSR-3 a PSR-7. A spoustu dalších novinek, díky kterým bude psaní aplikací zase o něco zábavnější.
Kdy vyjde která verze?
Zažil jsi migraci ze Symfony 1 na 2 a chceš se vyhnout podobnému masakru? Neměj obavy – novinek je sice spousta, ale Symfony se poučilo a nedá dopustit na zpětnou kompatibilitu.
Migrace Symfony 2 na 3 bude značně zjednodušena tím, že spolu s verzí 3 vyjde i verze 2.8. Ta bude mít všechny nové featury verze 3 a bude obsahovat BC vrstvu k sérii 2.x. Verze 2.8 bude long term support (LTS) – můžeš tak počítat s podporou až do konce roku 2018.

Verze 2.8 bude LTS. První LTS nové série bude až 3.3 (vyjde v květnu 2017).
Jaké jsou tedy 2 hlavní rozdíly mezi 3.0 a 2.8?
- min. verze PHP 5.5
- odstraněný veškerý deprecated kód, který poskytuje BC kompatibilitu k 2.x (~ 10 % kódu)
A nyní ke 4 očekávaným novinkám
1. Autowiring služeb
Symfony nyní podporuje constructor autowiring. Při vytváření definice služby tak můžete zapnout autowiring
a přeskočit manuální předávání argumentů. V českém prostředí je autowiring poměrně populární díky bundlům jako Kutny, Skrz a Symnedi.
Jak to v praxi vypadá?
Dřívější dlouhý zápis
# services.yml
services:
myService:
class: MyBundle\MyService
arguments: [ @dependency1, @dependency2 ]
dependency1:
class: MyBundle\Dependency1
dependency2:
class: MyBundle\Dependency2
nyní můžeš zkrátit na
# services.yml
services:
myService:
class: MyBundle\MyService
autowire: true
Jak to funguje?
Dependency Injection container zanalyzuje konstruktor služby a:
- pokud jsou služby dostupné → předá je
- pokud ne → registruje je jako privátní služby
Jak je to s interface?
Místo konkrétního typu služby můžeš vyžádat interface, který služba implementuje. Ale co když máme více služeb jednoho interface (typické pro chain pattern)? Stačí u dané služby explicitně uvést:
# services.yml
services:
dependency1:
class: MyBundle\Dependency1
autowiring_types: MyBundle\MyInterface
Chceš vědět víc? Mrkni na pull-request
2. Logičtější složky
Symfony 3 full-stack s sebou přináší řád. Zbaví nás chaosu ve složce /app
.
Jak?
Dočasné soubory, logy, nastavení pro PHPUnit, konzolové soubory…
To vše má nyní jasné umístění oddělené od kódu naší aplikace.

Console skripty najdeš nyní ve složce
/bin
. Dočasné soubory /cache
a /logs
pak ve složce /var
.Testy pak v příkazové řádce spustíš jednoduše přes phpunit
.
3. Symfony profiler v novém kabátku
Pro programátora je důležitý nejen přehledný kód, ale i přehledné meta-informace o aplikaci. Ty si v Symfony snadno zobrazí pomocí Symfony Profileru.
Ten už zobrazoval tolik informací, že se v něm programátor začal ztrácet. Po 4 letech se konečně dočkal flat designu.
Důležité informace a hlavně chybové hlášky jsou teď mnohem čitelnější.
Srovnání staré a nové verze

Dříve bylo těžké se rychle zorientovat ve velkém množství informací.
Teď ty důležité najdeš hned na začátku stránky

Zajímá tě víc? Mrkni na pull-request
4. Micro Kernel
Velkou radost budou mít vývojáři menších aplikací, kteří si rádi užívají komfort ekosystému full-stack Symfony. Před pár dny, 5. listopadu, byl do FrameworkBundle přidán Micro Kernel.
Ten je vhodný právě na aplikace, které vyžadují jednoduchou konfiguraci, bundly a na které Silex nestačí.
Co Micro Kernel přinese:
- nevyžaduje žádné další konfigurační soubory
- umožňuje přidání extension bez bundlů
- podporuje routování
Jak takový Micro Kernel vypadá?
<?php
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\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Routing\RouteCollectionBuilder;
class ConcreteMicroKernel extends Kernel
{
use MicroKernelTrait;
public function halloweenAction()
{
return new Response('halloween');
}
public function registerBundles()
{
return [new FrameworkBundle()];
}
protected function configureRoutes(RouteCollectionBuilder $routes)
{
$routes->add('/', 'kernel:halloweenAction');
}
protected function configureContainer(ContainerBuilder $containerBuilder, LoaderInterface $loader)
{
$containerBuilder->loadFromExtension('framework', [
'secret' => '$ecret',
]);
$containerBuilder->setParameter('title', 'Symfony 3 is painless');
}
}
Zajímá tě víc? Mrkni na pull-request
Teď už víš…
- Že verze 2.8 bude LTS a vyjde spolu s verzí 3.0.
- Jak ti autowiring ušetří práci při psaní definicí služeb.
- Jak si uklidit složku
/app
, aby to dávalo smysl. - Že práce s profilerem bude daleko přehlednější.
- A že pro malé aplikace máš k dispozici Micro Kernel.
V Symfony zase vědí…
- Že když programátor může sáhnout po jednoduším řešení, udělá to.
Proto se snaží, aby jeho použití bylo bez překážek.
Už máš chuť si to vyzkoušet? Příště popíšu, jak to rozjet v Symfony 3.
Už v Symfony děláš léta a chceš posdílet zkušenosti?
Nebo tě Symfony zatím jen láká a rád by se o něm dozvěděl více? Přijd si pokecat na pravidelné měsíční srazy v Praze a Brně.
Díky za přehled! Autowiring mě moc nerajcuje (ostatně stačí se podívat do diskuze ke commitu, že to není jen nástroj pro růžovou budoucnost, ale i tak dobře ho mít…), profiler už používám, je supr a původní složky byly poměrně nelogické, dobře že se rozhodli vyhodit var a bin do rootu. Většinu změn api už jsem zaregistroval přechodem na 2.8-dev, kdy vesměs všechno funguje jako v předchozí verzi a změny jsou označeny jako @deprecated takže je to v IDE dobře vidět přičemž v docbloku je většinou naznačena alternativa. Kdyby tahle štábní kultura fungovala i jinde byla by to paráda…
Autowiring je subjektivní věc. Osobně jsem rád za možnost ho snadno použít, když chci, ale zároveň nejsem nucen.
Se štábní kulturou souhlasím. Přechod ze starších verzí je opravdu hračka. Je to vlatně pár jednoduchých návyků, na které core team dává pozor.
Píšeš, že jsi zkoušel 2.8-dev. Upgradovals kvůli nějakým kokrétním featurám?
Ani ne, jen jsem upgradoval vnitrnosti projektu v 2.6 a rovnou se rozhodl jit s dobou. S3 jsem se trochu bal a precejen LTS je LTS…
MicroKernel se bude určitě hodit třeba pro menší AJAXové operace, kde není potřeba nic jiného než repository nebo spojení do databáze a ušetří se trochu těch systémových prostředků…
Už si nějakou dobu hraju s 2.8-dev a nový vzhled profileru je rozhodně přínos. Teď je otázkou, jak dlouho bude trvat všem zajímavým projektům migrace na 3.0. Bohužel v dnešní době (pekla) závislostí na cizích projektech to bude pravděpodobně trochu pomalejší nástup. Projekty jako je Sonata, Sylius apod. v blízké době asi nepředpokládají migraci na 3.0, což je škoda. Když se podívám, kolik deprecated volání teď běžná aplikace psaná v 2.3 – 2.7 mají, tak se toho trochu bojím :-) Ale uvidíme ….
Jinak se těším na další článek :-)
Dobrý nápad s využitím jednoduchých AJAX operací.
Co se migrace bundlů na 3.0, je k tomu iniciativa od WouterJ. Tedy seznam bundlů, které je potřeba aktualizovat a otestovat. Sám se na vývoji podílím a jde to docela svižně. Necelých 50 % už je Symfony 3 friendly.
Po spuštění Symfony 3 bude migrace ještě snazší a rychlejší.
Navíc má smysl aktualizovat až na Symfony 3.1. Verze 2.8 má stejné features jako 3.0. Takže do dubna 2016 není kam spěchat.
Narazil jsem na jednu chybičku: pro zapnutí autowiringu v services.yml zde máte
autowiring: true
, což nefunguje. Správně by mělo býtautowire: true
.Díky za povšimnutí. Chybku opravíme.