4 žhavé novinky v Symfony 3

This post is deprecated since August 2017
This post is available only in Czech and whole website was moved to English.

V listopadu 2015 má kromě PHP 7 a Drupalu 8, vyjít i Symfony 3. Jaké přináší změny a novinky?

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

V tomto článku se dozvíš

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?

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 nebo Skrz.

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
        autowiring: true

Jak to funguje?

Dependency Injection container zanalyzuje konstruktor služby a:

Jak je to s interface?

Místo konkretní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ý design>
    <br>
    <em>Srovnání staré a nové verze</em>
</div>


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čí.

Micro Kernel konkrétně:

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

V Symfony zase vědí...

Proto se snaží, aby jeho použití bylo bez překážek.

Už máš chuť si to vyzkoušet? Hned v příštím článku si ukážeme, jak to rozjet v Symfony 3.


A máš to



Found a typo? Fix it to join team of 64 people that improve content here

❤️️ Do you like what I write about? Or do you hate it but enjoy discussion? 😠
You can support my writing by throwing a couple bucks at my Patreon