Střípky ze symfony školení
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;
}