Střípky ze symfony školení

posted 11.10.2014

Koncem srpna nám do LMC přijel Hugo Hamon (@hhamon), šéf vzdělávání v SensioLabs. Strávili jsme tři dny školením, které se dotklo jak základů Symfony, tak některých pokročilejších aspektů.

První den se nesl v duchu srovnání všech účastníků na podobnou úroveň v základech, mnozí z nás tedy měli pochybnosti o užitečnosti školení. Další dva dny to ale dost napravili a zkusím napsat pár konkrétních myšlenek a tipů, které jsem si z průběhu odnesl.

XML pro konfiguraci služeb

Většina nových vývojářů začne v Symfony pro služby psát konfiguraci služeb v YAMLu, ostatně Team JOBS začal podobně. YAML nám přišel čitelnější a přehlednější, Hugo se ale poměrně silně zastával XML.

Zadarmo dostanete validaci (chybějící dvojtečky v YAMLu se začnou objevovat docela brzo a chvíli trvá je oddebuggovat) a čitelnosti to rozhodně neublížilo. Symfony2 plugin do PhpStormu se navíc chytá ještě lépe než v YAMLu a víc důvodů už jsme nepotřebovali. Další výhodou je, že vývojáři lépe rozumí a ihned chápou konfiguraci Bundlů třetích stran, které ve většině případů mají konfiguraci v XML.

Oprávnění pomocí Voterů

K původní ACL komponentě v Symfony jsem se nikdy nedostal, od 2.3 je ale dost pravděpodobné, že se k ni nedostanu ani v budoucnu. Pro 9 z 10 stačí implementovat nový Voter.

Bonus: od Symfony 2.6 se jejich implementace o dost zkrátí díky defaultní implementaci často se opakujících metod.

Soukromé služby

Pokud máte službu, která je jen závislostí pro jinou a samostatně jí nepoužíváte, vyškrtnětě jí z finálního kontejneru tím, že jí nastavíte jako private.

<services>
    <service id="foo" class="Foo\Foo">
        <argument type="service" id="bar"/>
    </service>
    <service id="bar" class="Foo\Bar" public="false"/>
</services>

Líné služby

Jobs.cz je aplikace hodně zatížená na čtení. Zápisů z front-endů do API a databází je minimum, čteme ale mnohokrát na každé stránce. Některé z těchto dotazů jdou na relační databázi a na nějakou dobu se zacachují. Naše centrální služba pro volání API má PDO (tranzitivně) jako závislost a při zavolání jeho konstruktoru se naváže spojení. Vzhledem k tomu, že se skutečný SQL dotaz pustí jednou za několik minut, je zbytečné ho navazovat při každém requestu.

Řešením jsou lazy-loaded služby. Je nutné mít navíc nainstalovaný ocramius/proxy-manager, který není ani ve full-stack Symfony balíčku. Pozor na to, že samotné PDO jako službu nelze z implementačních důvodů v PHP nastavit jako lazy, je potřeba nastavit jako lazy wrapper nad ním.

V Jobsech to pak vypadá následovně v JobsApiExtension.php (máme více handlerů pro více databází):

<?php

function createDatabaseHandler($databaseName)
{
    $handler = new Definition(DatabaseHandler::class);
    $handler->setArguments([new Reference('jobs.api.db.' . $databaseName), $databaseName]);
    $handler->setLazy(true);

    return $handler;
}