Přejít k navigační liště

Zdroják » PHP » 4 žhavé novinky v Symfony 3

4 žhavé novinky v Symfony 3

Články PHP

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.

Nálepky:

Č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.

Release plan
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.

Release plan
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ší.

Nový designSrovnání staré a nové verze

Starý a nový design
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

 

Odkaz na stránku
Snadno se dostaneš z profileru zpět na stránku

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ě.

Komentáře

Subscribe
Upozornit na
guest
7 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Já

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…

Já

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…

Lukáš Brzák

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 :-)

Rostislav Vítek

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ýt autowire: true.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.