On Github jolicode / best-bundle-conf
Une présentation par Damien Alexandre / JoliCode Symfony Live Paris 2013
...Poney, Guinness et gif animés.
Symfony2 est lui même un Bundle !
Pensez à doctrine-bundle, sensio/distribution-bundle, sensio/framework-extra-bundle, sensio/generator-bundle
cache:clear et assets:install, c'est pas dans Symfony mais dans Distribution Bundle
* source : knpbundles.com (on en trouve 1667 sur packagist et 988 sur symfohub)
Si on compte les jours depuis la premières version publique de SF2 en fev. 2010Et d'un côté : tant mieux...
il y aurait 1600 plugins RoR et 1688 packages Django.<?php class PoniesController { public function getPoniesAction() {} // "get_ponies" [GET] /ponies public function newPoniesAction() {} // "new_ponies" [GET] /ponies/new
/** * @Gedmo\Timestampable(on="create") * @ORM\Column(type="datetime") */ private $created; /** * @Gedmo\Blameable(on="create") * @ORM\Column(type="string") */ private $createdBy;
Cité dans la doc officielle
Les meilleurs Bundles sous la responsabilité des contributeurs les plus motivés et compétents.
Par Thomas Rabaix ici présent (a donné une conf hier). Sonata c'est aussi des Bundles de gestion de Media, de Cache, de Block... La description dit "e-commerce" mais il n'en est rien. (20 bundles)
23 bundles pour une solution e-commerce inspirée par Spree (Ruby)
Qui a dit « fainéant » ?
{% block genemu_jqueryrating_javascript %} {% spaceless %} <script type="text/javascript"> jQuery(document).ready(function($) { $('[name="{{ full_name }}"]').rating({{ configs|json_encode|raw }}); }); </script> {% endspaceless %} {% endblock genemu_jqueryrating_javascript %}
<?php // ... public function buildForm(FormBuilder $builder, array $options) { $builder ->add('captcha', 'genemu_recaptcha'); }
agit en remplacement ou complément des fixtures après tout, il expose Faker en tant que service
echo $faker->name; // 'Lucy Cechtelar'; echo $faker->address; // "426 Jordy Lodge // Cartwrightshire, SC 88120-6700" echo $faker->text; // Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi // beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt // amet quidem. Iusto deleniti cum autem ad quia aperiam. // A consectetur quos aliquam. In iste aliquid et aut similique suscipit.
bazinga_faker: entities: Joli\PonyBundle\Model\Pony: number: 5 Joli\PonyBundle\Model\Guinness: number: 55
On peut servir des fichiers sans les mettre dans /web !
Utiliser SendFIle c'est juste un header HTTP
use Symfony\Component\HttpFoundation\BinaryFileResponse $file = '/var/private/r-black-Friday-Friday.mp4'; $response = new BinaryFileResponse($file); $response::trustXSendfileTypeHeader();
(ouais je sais Guillaume en a parlé hier)
Interface basée sur Swagger-UI introspection et annotation pour avoir une doc toujours à jour<?php class PonyController extends Controller { /** * Ce blabla sera dans la documentation :) * * @Route("/pony") * @Method({"GET"}) * @ApiDoc( * resource=true, * description="Obtenir des poneys", * filters={ * {"name"="color", "dataType"="integer"} * } * ) */ public function getAction() { }
app/console api:doc:dump --format=html > api.html
Markdown, HTML, Json
Performance et statistiques sont nos amis
* (Attention quand même)
Memcache quand il a plus de place, il... SUPPRIME.
Bundle tout réçent
lsw_memcache: clients: default: hosts: - { dsn: localhost, port: 11211 }
$this->get('memcache.default')->set('Ponies', 'Are Awesome', 1111); $this->get('memcache.default')->get('Ponies');
Grandement configurable (toutes les options de memcached)
lsw_memcache: session: client: default
$this->get('memcache.default')->setAdp('Ponies', 'Yolo', 1111); $this->get('memcache.default')->getAdp('Ponies');
MySQL Native Driver:
Notez que c'est JS, pas JMS, ce n'est pas le johannes que l'on connait
Avec un plugin mysql ND, nommé Query Cache, on a une stack trace possible.
Le truc sert à faire du cache de query/result applicatif, mieux que celui de Doctrine.
Marche avec APC, Memcache...
zenstruck_cache: sitemap_provider: true
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>http://local.sf2-bundles.com/</loc></url> <url><loc>http://local.sf2-bundles.com/registration/</loc></url> <url><loc>http://local.sf2-bundles.com/demo/</loc></url> <url><loc>http://local.sf2-bundles.com/demo/hello/World</loc></url> <url><loc>http://local.sf2-bundles.com/demo/hello/Coucou</loc></url> <url><loc>http://local.sf2-bundles.com/demo/hello/Poney</loc></url> </urlset>
Bonus : Un Bundle pour générer votre sitemap !
awesome_url_provider: class: Acme\DemoBundle\HttpCache\AwesomeWarmupProvider tags: - { name: zenstruck_cache.url_provider }
<?php use Zenstruck\Bundle\CacheBundle\HttpCache\UrlProviderInterface; class AwesomeWarmupProvider implements UrlProviderInterface { public function getUrls($host = null) { $urls = array(); // do ur biznessss return $urls; } }
app/console zenstruck:http-cache:warmup http://local.sf2-bundles.com 4/5 [======================>-----] 80%
{{ nelmio_js_error_logger() }}
(function() { var oldErrorHandler = window.onerror; window.onerror = function(errorMsg, file, line) { if (oldErrorHandler) { oldErrorHandler(errorMsg, file, line); } (new Image()).src = '/nelmio-js-logger/log?msg='; // [...] }; })();Bien sûr la route est configurable dans le routing
Sans NelmioJsLoggerBundle, elle serait perdue à jamais :(
[2013-03-23 19:38:20] event.DEBUG: blablabla [2013-03-23 19:38:20] event.DEBUG: blablabla [2013-03-23 19:38:20] frontend.ERROR: Uncaught ReferenceError: loadCornify is not defined {"file":"http://local.sf2-bundles.com/app_dev.php/demo/hello/World","line":"50","browser":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22","page":"http://local.sf2-bundles.com/app_dev.php/demo/hello/World"} [] [2013-03-23 19:38:20] event.DEBUG: blablabla
{{ nelmio_js_logger() }} {# Expose une fonction log() #}
Et pourquoi ne pas remplacer aussi console.log() !
jns_xhprof: location_lib: "/usr/share/php5-xhprof/xhprof_lib/utils/xhprof_lib.php" location_runs: "/usr/share/php5-xhprof/xhprof_lib/utils/xhprof_runs.php" location_config: "/usr/share/php5-xhprof/xhprof_lib/config.php" location_web: "http://127.0.0.1/xhprof/" enabled: true
On est tous un peu intégrateur
lexik_maintenance: authorized_ips: ['127.0.0.1'] driver: ttl: 3600 class: '\Lexik\Bundle\MaintenanceBundle\Drivers\FileDriver' options: file_path: '%kernel.root_dir%/cache/lock'
./app/console lexik:maintenance:lock
Se customise comme les autres : error503.html.twig.
{{ url('bazinga_exposetranslation_js') }}
<script type="text/javascript" src="/bundles/bazingaexposetranslation/js/translator.min.js"> </script> <script type="text/javascript" src="http://local.sf2-bundles.com/app_dev.php/i18n/messages/en"> </script>
Translator.locale = 'en'; Translator.defaultDomains = ["messages"]; Translator.add("messages:homepage.pony", "I fucking love ponies"); Translator.add("messages:symfony2.great", "I love Symfony2");
Translator.has('messages:homepage.pony'); >> true Translator.get('messages:homepage.pony'); >> "I fucking love ponies" Translator.get('messages:homepage.pony.unknown'); >> "messages:homepage.pony.unknown" Translator.locale >> "en"
Les mêmes traductions au front et au back \o/
VOus pouvez n'exposer qu'un catalogue (faire un catalogue "js" par exemple)./** * @var string * * @Assert\MinLength( * limit=3, * message="Your pony name is not verbose enough!" * ) * @Assert\NotBlank() * @ORM\Column(name="name", type="string", length=255) */ private $name;
{{ JSFV(form) }}
<script type="text/javascript" src="/bundles/jsformvalidation/js/_demo_hello_form.js"></script>
_demo_hello_form.js = Nom de la route + Nom du Form
check_form_name: function() { var gv; result = true; result = result && checkError('form_name', MinLength, {message:"Your pony name is not verbose enough!", limit:3, charset:"UTF-8"} ); result = result && checkError('form_name', NotBlank, {message:"This value should not be blank."} ); return result; },
<div> <label for="form_name" class="required">Name</label> <ul class="error_list"> <li>Your pony name is not verbose enough!</li> </ul> <input type="text" id="form_name" name="form[name]" required="required"> </div>Il va chercher les traductions dans la clé "validators" par défaut
Carambar® is coming
Une documentation en Japonais
What could possibly go wrong...
$ app/console symfonyan:exception-install Installing symfonyan exception to app/Resources/FrameworkBundle
Destination fausse, vues 2.0... mais on corrige !
$ app/console symfonyan:welcome-install Installing symfonyan welcomepage to app/Resources/AcmeDemoBundle
$request = \sfContext::getInstance()->getContainer()->get('request');
Problème de scope / dépendance ? Plus jamais !
\sfContext::createInstance($this->container); \sfContext::getInstance();
NON
$ app/console wurst:print Art from: http://www.wurstblog.de/aufschnitt/ascii-wurst .c. .0MXd' ,KMMMMWO:. :NMMMMMMMMXo. .,:cllllc:,.. lWMMMMMMMMMMMWk; .,cd0NWMMMMMMMMMMWN00WMMMMMMMMMMMMMMMKo. .ckXMMMMMMMMMMMMMMMMMMMMMMMMWNXK00Okxdolc:, 'l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMNo. .l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWo .cOWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN' 'dXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX. ;OWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX; .lKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0l. .oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXkc. ;KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKd;. .xWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXd, '0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWO:. ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNx' :NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk' ;NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK; .XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk. kMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWd ;WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx kMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk. .XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0. ;WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMo ;WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMl ,NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd .XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0. xMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk. ;WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd kMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWl 'XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWo :NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk. cWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK; :XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWl .0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN' .xWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK. :XMMMMMMMMMMMMMMMMMMMMMMMMMMMMK, .dNMMMMMMMMMMMMMMMMMMMMMMMMKl. .ckXWMMMMMMMMMMMMMMMMMXd, ':lxkO0KK00WMMMMMMN0xl;. .KMMMMMMMMMMMWXOd:'. .0MMMMMMMMMMMMMMMN0o' OMMMMMMMMMMN0xc,. OMMMMWX0dc'. xKkl;. ..
Usage: wurst:print [--mit-pommes] [--mit-mayonnaise] [--mit-beer] [--mit-pretzel] [--mit-coffee] [--mit-kase] [--mit-chocolate] [--mit-wine] [--mit-tea] [--mit-ketchup] [--mit-aioli] [--mit-tomato] [type] Arguments: type Which type of würst you want (blackpudding, wiener, salami, running-wurst, bratwurst_mit_broetchen, classic, schwarzwurst, landjaeger, veggie, choux, chorizo, gerauchertewurst, mettwurst, botifarra_mit_mongetes, currywurst, grill-servelat, wurst_morteau_fr, vegan, weisswurst, im_schlafrock, hotdog)? (default: "classic")
app/console wurst:print im_schlafrock --mit-beer .,:;::;;;:, .::rS2XX25i2223&G&H&Xh35r,. ;53MB32Si525iSisri5hAh222XAG&35;. rh&h225iiisrrr;5iSs;r2SrS2SsS5S2X3h5rr: ii.;ii52i5iiSiiir;ri55Sr:;rrrsrsSS2222XX&A22Xr;.. :#@::X2;srri5rrriSirsrrrrrr;sr;rrsss5si3X5ii;rS9A3X5ir;,. &@r,AAXSsSi;sisrrr;;rr;;;:;ssssrrr;rr;rsSSSSrs;;rs3X9hHhHA2: #@,;A2i522r:;riisssirrsrrr;;;;r;;;:,rsXi52Xir;:r;r52X32;;sA@H. 9@3 .;rrrrsr;,:;rrsiS;:rr:;r:;r;r;;;rrr;5ii;;;ir;;rrsi55isssX&s. i&@#r:. .,;iir:;rr;;rr;,:;r;;::;;;r;;;:,,s,:,;sS,:s:rrss232SS9AAGr ,5@@@@@@9::ssrrrsr;s;:r::;;;::,:rr;;;,,;;, ,,rriir:,:;rii2XissrrSXirr ;ii2iXhr::,;rsr;;rr;;;.:, :r:,;,:;,,:;;..:s,:S5r::rrisi;.;ir;rrsS52XS:. .2HHHM@@B9552srsr.,..,,,:.,,. .:,..,;;:::,,sisir.;is:s.,i5522S5X9&H##A9s. ;XH#@@@@@@@@@@Hr,. ..,:,,,.,:.. :::;,..::,;rr,ss,,s;r;rSSSiiiSiri3hM#B5 ,;i9H#@@@@@@&i:.. ,;::,.,,,:;..:,;,.:ii:rs r;s;:rSiiissr;:s23AX52i; :ih#@@@HS: .:..:..;s::i::::rX2;;;;rrs:;:rrs32S2S55siX9##G22; ,S#@@3, ,, ...,;;,;:;r:r;;r,.:;rSrrr5255S29522riXAM##AABBr ;@@3; ,:,;;r,:r;,,.;:.,;sr;:i3iSXrsssi2X32sSAG32MBB## SB#&; ::;r;.;,,r:.: ,::;::;ssiS;rs2BMGAh3ii&9G9M&MH@& .r2S,. ;. :r.:r,.,.,,::;rSs:sir;r9GA#HGhGXX2XXXSi2G@: ,;;...:r;. ..,.,,,,:;sr.:iiiSsihHGSrr22s;;;;;;r5BS .::;;: ....,,.,:;;:;rrrrr;XG5isr,:;:.,,,,:;S#H ,;2X;..,....,;;:,;;.;;;rr2Sr;,...,Ss;r;. .,9: r&&i;, ..,,:.,..:r:irSi; ,rr:r&S:,.... , .2#Hr. ,,,.:rrisi;,:rG@#Ah2XMi..,. ;: i@M2. ,:,,;risr,.h@@@@#XSiri3r,....,. s#A,.,:,,:rS; A@@@##A;:hsiShr,... i5,,;:::rr,;@@#HHBhrrX;iS2Gr,. :rr,:;;;r,;##H#@MA3r:rS252i:, .,,.;;:;;;2hH@@#AAX399h2s;: ..,;;;;:;SXhBG9A9GhXs:.;. .:;r;:rsrS52Si;,,,, :SXXA2S5X5i2s:. :ssrrr;:r. _.._..,_,_ ( ) ]~,"-.-~~[ .=])' (; ([ | ]:: ' [ '=]): .) ([ |:: ' | ~~----~~ from : http://www.ascii-art.de/ascii/ab/beer.txt
Si vous ne savez pas quoi faire demain au Hacking Day !
http://jolicode.github.com/best-bundle-conf/
coucou@jolicode.com