<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Amicalement Web - Astuces et Bons plans dans le développement web &#187; Symfony</title>
	<atom:link href="http://www.amicalement-web.net/tag/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.amicalement-web.net</link>
	<description>Astuces et bons plans d&#039;un web developpeur</description>
	<lastBuildDate>Thu, 25 Apr 2013 12:20:06 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.1</generator>
	<item>
		<title>Dopez vos anciens sites au fur et à mesure</title>
		<link>http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/</link>
		<comments>http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/#comments</comments>
		<pubDate>Thu, 14 Feb 2013 13:58:41 +0000</pubDate>
		<dc:creator><![CDATA[Tim]]></dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Component]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1926</guid>
		<description><![CDATA[Aujourd&#8217;hui, je ne vous apprends rien, le développement web s&#8217;est considérablement professionnalisé et on ne fait plus de sites web comme on les faisait il y a 10 ans. Mais pourtant il y a bien des sites web qui ont encore 10 ans et n&#8217;ont jamais été refondu. Pourquoi refondre quelque chose qui fonctionne me [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/" rel="attachment wp-att-1930"><img src="http://www.amicalement-web.net/wp-content/uploads/vitamin.jpg" alt="" title="vitamin" width="614" height="200" /></a></p>
<p>
Aujourd&#8217;hui, je ne vous apprends rien, le développement web s&#8217;est considérablement professionnalisé et on ne fait plus de sites web comme on les faisait il y a 10 ans. Mais pourtant il y a bien des sites web qui ont encore 10 ans et n&#8217;ont jamais été refondu.
</p>
<p>
Pourquoi refondre quelque chose qui fonctionne me direz-vous ? Oui bonne question ! La principale me semble la maintenance et l&#8217;évolution du site qui devient au fil des années, compliquée voir quasi impossible.
</p>
<p>
Mais refondre un site from scratch n&#8217;est pas de tout repos et finalement peut-être pas la meilleur idée. Du coup, nous allons voir un cas pratique de migration en douceur d&#8217;un site &#8220;old scool&#8221;.<br />
<span id="more-1926"></span>
</p>
<h3>Le contexte</h3>
<p>
Nous parlons d&#8217;un site ici où chaque page web est représentée par une page php. Pas de rewrite. Chacune faisant un nombre incalculable de require, include, echo. Où beaucoup de développeurs sont passés par là, chacun sur le temps perso, pour la plupart le développement étant un loisir.<br />
Pas la peine de vous faire un dessin, vous voyez le tableau.
</p>
<h3>L&#8217;objectif</h3>
<p>
Mettre en place une pseudo v2 progressive : <br />
Recréer chacune des pages sur un nouveau socle applicatif plus actuel puis optimiser l&#8217;ensemble une fois toutes les pages crées. Les anciennes pages, doivent fonctionner avec les nouvelles sans changement dans les premières. En gros, tout le monde ne doit y voir que du feu.
</p>
<h3>Fonctionnement</h3>
<p>
Pour réaliser ça, je me suis pas foulé, je me suis tout simplement inspiré de ce que Fabien avait pris le temps de mettre par écrit dans sa série : <a  href="http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1">&#8220;Create your own Framework&#8221;</a>.
</p>
<p>
Du coup c&#8217;est plus la mise en pratique que je vais détailler. Nous allons donc migrer une page qui s&#8217;appelle : <code>rechercheJoueur.php</code>
</p>
<p>
Première étape, configurer notre nouvelle app en créant un fichier <code>v2.php</code> à la racine de notre serveur (vu que le vhost pointe ici) et contenant <a  href="http://fabien.potencier.org/article/54/create-your-own-framework-on-top-of-the-symfony2-components-part-5">le code de l&#8217;étape 5 de fabien</a>. <br />
A partir de là, on a déjà quelque chose de sympa et quasi prêt à emploi. Faisons le test.
</p>
<p>
Dans notre <code>app.php</code> on va donc déclarer en route la première page qu&#8217;on va migrer. Genre ça:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">use</span> Symfony\Component\Routing<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$routes</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Routing\RouteCollection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$routes</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'search'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">new</span> Routing\Route<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'rechercheJoueur.php'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'_controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'render_template'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$routes</span><span style="color: #339933;">;</span></pre></div></div>

<p>
On va c/c le contenu de notre ancienne page dans le dossier <code>src/pages</code> définies dans la fonction <code>render_template</code> en prenant soin de la renommer par <code>search.php</code> (nom de la route).
</p>
<p>
A ce niveau bien sûr, si vous accédez à l&#8217;ancienne url, vous tombez toujours sur l&#8217;ancienne page.<br />
Nous allons donc créer un .htaccess à la racine avec tout simplement :
</p>
<pre>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ v2.php [QSA,L]
</IfModule>
</pre>
<p>
Pas besoin de grand discours, en gros, tout les urls qui ne pointent pas sur une ressource existante, iront maintenant sur notre nouvelle application.
</p>
<p>
Renommons maintenant notre ancienne page. Et tentons d&#8217;y accéder (par son ancien nom) et magie, on pointe désormais sur la nouvelle page qui doit se comporter exactement comme l&#8217;ancienne vu que finalement, on a pas changé grand chose pour l&#8217;instant.
</p>
<p>
Mais le principal avantage c&#8217;est que toutes nos pages <strong>passent par le même endroit</strong> désormais.
</p>
<p>
Du coup la prochaine étape, est celle décrite dans <a  href="http://fabien.potencier.org/article/55/create-your-own-framework-on-top-of-the-symfony2-components-part-6">la partie 6</a>, utiliser <code>HttpKernel</code> et son <code>ControllerResolver</code> pour utiliser des controller en lieu et place de notre function <code>render_template</code>.
</p>
<p>
On pourra alors sortir tout le code php de notre page à migrer, et le mettre dans le controller en 1ere étape de séparation du code php / html.
</p>
<p>
Je me suis ensuite arrêté là niveau applicatif. J&#8217;ai trouvé que j&#8217;avais tous les éléments à ma disposition. Mais n&#8217;hésitez pas à continuer la suite de la série de Fabien.
</p>
<p>
Du coup, au lieu du DIC de Symfony2 dont <a  href="http://fabien.potencier.org/article/62/create-your-own-framework-on-top-of-the-symfony2-components-part-12">Fabien parle dans l&#8217;étape 12</a>, j&#8217;ai personnellement opté pour <a  href="http://pimple.sensiolabs.org/">Pimple</a> vu que le site n&#8217;est vraiment pas compliqué niveau technique et que je n&#8217;avais pas besoin de l&#8217;artillerie lourde de ce côté.
</p>
<p>
Du coup, j&#8217;ai injecté dans Pimple, une connexion DBAL de doctrine et twig comme moteur de template et j&#8217;ai décidé d&#8217;injecter directement tout ce container dans tous mes controllers (même si on est d&#8217;accord que c&#8217;est le mal) mais en l&#8217;état c&#8217;est pas vraiment problématique j&#8217;ai juste 2 services.
</p>
<p>
Du coup j&#8217;ai un peu modifié la partie concernant l&#8217;appel au controller dans mon <code>v2.php</code> pour reproduire le <code>setContainer</code> propre au <code>ContainerAwareInterface</code> mais qui attend un <code>ContainerInterface</code> du DIC. Pour utiliser Pimple dans nos containier, il faut donc reproduire ce setContainer.
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">try <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">attributes</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matcher</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPathInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$controllers</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$resolver</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getController</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// on instancie notre controller </span>
    <span style="color: #000088;">$controller</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$controllers</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// on récupère l'action</span>
    <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$controllers</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// On injecte Pimple</span>
    <span style="color: #000088;">$controller</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setContainer</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$container</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// On récupère les arguments</span>
    <span style="color: #000088;">$arguments</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$resolver</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getArguments</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #339933;">,</span> <span style="color: #000088;">$controllers</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$controller</span><span style="color: #339933;">,</span> <span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Routing\Exception\ResourceNotFoundException <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Response<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Not Found'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">404</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Response<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'An error occurred'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
Voilà, un peu brut, mais ca fait son job rapidement. Il suffira de créer un controller qui contiendra cette méthode <code>setContainer</code> et dont tous nos controllers hériteront. Et nous pourrons alors utiliser notre dbal et notre twig dans nos actions !
</p>
<p>
La suite n&#8217;est que du refactoring du code existant. Faites déjà fonctionner une page, essayant de découper les traitements dans des classes adéquates. Chaque nouvelle page, apportera son lot de cas particulier, mais plus ça ira et plus ce sera simple de migrer les pages.
</p>
<h3>Et ensuite ?</h3>
<p>
Je n&#8217;y suis pas encore, mais j&#8217;imagine qu&#8217;une fois qu&#8217;on s&#8217;est affranchi des contraintes de l&#8217;ancien système, on peut commencer à optimiser un peu, créer une couche modèle, peut-être envisager un ORM ? Ou tout simplement se dire, que c&#8217;est bien suffisant et que maintenant, n&#8217;importe quel dev avec une connaissance du MVC devrait pouvoir utiliser et maintenir le code ! Et c&#8217;était quand même l&#8217;objectif ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>de PHP / symfony à Ruby / Rails : un an après</title>
		<link>http://www.amicalement-web.net/php-symfony-ruby-rails-un-an-apres/2011/06/28/</link>
		<comments>http://www.amicalement-web.net/php-symfony-ruby-rails-un-an-apres/2011/06/28/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 09:00:43 +0000</pubDate>
		<dc:creator><![CDATA[Tim]]></dc:creator>
				<category><![CDATA[Réflexion]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[switch]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1815</guid>
		<description><![CDATA[J&#8217;ai toujours très peu de temps dispo, d&#8217;où la fréquence de publication proche du néant depuis pas mal de mois. La faute à un bureau toujours trop sommaire à la maison, les travaux s&#8217;éternisant, et le peu de temps libre qui me reste est consacré à quelques projets pour l&#8217;instant un peu &#8220;top secret&#8221; ;) [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/?attachment_id=1819"><img src="http://www.amicalement-web.net/wp-content/uploads/switch.png" alt="" title="switch" width="614" height="100" class="alignnone size-full wp-image-1819" /></a><br />
J&#8217;ai toujours très peu de temps dispo, d&#8217;où la fréquence de publication proche du néant depuis pas mal de mois. La faute à un bureau toujours trop sommaire à la maison, les travaux s&#8217;éternisant, et le peu de temps libre qui me reste est consacré à quelques projets pour l&#8217;instant un peu &#8220;top secret&#8221; ;)</p>
<p>On pourra remercier Vince au passage qui lui trouve du temps à consacrer à ce modeste blog !</p>
<p>Mais je viens de réaliser que cela allait faire quasi un an que j&#8217;avais attaqué Ruby / Rails de manière plutôt intensive et qu&#8217;un petit bilan s&#8217;imposait donc ! Alors je me lance !<br />
<span id="more-1815"></span></p>
<h3>Contexte</h3>
<p>Un petit coup de contexte, notre startup <a  href="http://autrementleblog.fr" rel="external">Autrement</a> édite 2 sites web, <a  href="http://www.chambresapart.fr">Chambres à part</a> et <a  href="http://hotelhotel.com">HotelHotel</a>. Le premier est en symfony1.4 et le 2e est en Rails3 suite à une décision prise fin 2009. Pour ceux que ça intéresse, Jérémy <a  href="http://jeremy.wordpress.com/2009/11/03/ruby-et-rails-ou-bien-php-et-symfony/">avait écrit un billet à l&#8217;époque sur ce choix</a>.</p>
<p>A l&#8217;époque je m&#8217;étais retrouvé un peu seul à tenter vainement de défendre symfony mais j&#8217;avais du me résoudre à me lancer dans le grand bain pour la conception d&#8217;HotelHotel à laquelle il fallait bien que je participe (bah oué on est un peu que 3 côté techos :p), c&#8217;était il y a quasi 1 an !</p>
<p>Je vous préviens, ceux qui me côtoient un peu s&#8217;y attendent surement ;), je n&#8217;ai pas vraiment changé d&#8217;avis : Ruby / Rails j&#8217;accroche pas, et de depuis quasi les premières lignes écrites. Et je vais essayer de retranscrire un peu mon ressenti et retour d&#8217;expérience.</p>
<h3>No révolution</h3>
<p>Déjà, aucune révolution, il faut le savoir. Les différences fondamentales sont assez &#8220;mineures&#8221; dans le sens où ca n&#8217;a pas changé grand chose dans ma manière de bosser. En fait, si vous avez fait du PHP et du symfony, vous saurez faire du Ruby et du Rails, mais vous (re)passerez par la case documentation les 6 premiers mois pour trouver les équivalents à vos connaissances PHP/symfony. </p>
<p>Et ça commence du coup mal. Apprendre un langage et un outil en essayant de tenir des &#8220;cadences&#8221; de production honorables pour son égo, c&#8217;est pas simple. C&#8217;est même assez compliqué et ça frustre !</p>
<p>Côté bilan, le langage il n&#8217;y a pas grand chose à redire si ce n&#8217;est ce côté implicite avec lequel j&#8217;ai encore maintenant beaucoup de mal, question de goût j&#8217;imagine. J&#8217;ai croisé un jour un gist avec 2 &#8220;versions&#8221; d&#8217;un même code, l&#8217;un en version totalement implicite, l&#8217;autre en version totalement explicite (je remets pas la main sur le lien) : pas photo pour moi, le 2e était clairement plus compréhensible sans même connaître Ruby !<br />
Mais les Rubyistes ont choisi le premier&#8230; ;)</p>
<p>Après, il est plutôt bien construit, l&#8217;api est clairement plus aboutie que PHP, et permet de faire tout autant de chose, et plutôt vite et bien une fois qu&#8217;on s&#8217;est habitué à sa syntaxe. Il faut être honnête Ruby n&#8217;a rien a envier à PHP en tant que langage pur. Mais la réciproque est pas loin d&#8217;être vrai. PHP se traine beaucoup de boulet, mais personne nous oblige à les utiliser.</p>
<h3>Pas de switch en vue</h3>
<p>Du coup pas vraiment de changement suffisant pour me dire que cela vaut le coup de &#8220;switcher&#8221;. Au contraire même, le problème (oui c&#8217;est un problème pour moi) de l&#8217;implicite rend toute lecture de code un vrai cauchemar ce qui m&#8217;a certainement ralenti et un peu découragé de me plonger à 110% dans le code comme j&#8217;aime tant faire. Parcourir des lignes de code que j&#8217;ai encore du mal à déchiffrer me décourage un peu. (Et oui désolé, mais moi, j&#8217;aime voir mes fins de lignes avec des points virgules !!!)</p>
<p>Pour le framework c&#8217;est une autre histoire. A vrai dire, je ne lui trouve pas grand chose pour lui. Attention, il vaut bien symfony 1 qui était ma référence lors de mon lancement dans Rails. Il permet de faire (quasi) tout autant de chose.<br />
Je précise quasi, parce que moi j&#8217;ai toujours la vague impression que je suis bridé, certainement parce que je suis encore loin de maitriser les rouages que j&#8217;avais pris le temps de décortiquer sur symfony.<br />
Et pourtant c&#8217;est déjà sa version3 (qui va avoir un an aussi d&#8217;ailleurs). Quand on voit le gap franchi avec symfony1 et Symfony2, la comparaison avec le second ne serait certainement pas à son avantage :p (:troll:)</p>
<p>Et c&#8217;est sans doute là que le bas blesse, je me suis retrouvé à repartir de zéro, en me disant que ça je saurais le faire de suite sur symfony, que Rails doit le faire aussi, mais qu&#8217;il fallait repasser par la case google. Et au final il le fait mais il ne fait guère plus. Donc peu de vrai &#8220;découvertes&#8221; et forcément, une petite déception&#8230;<br />
Je me retrouve avec 2 couteaux, pas la même forme/couleur, mais le rendu est bien le même, j&#8217;arrive à couper mon saucisson sans problème (j&#8217;étais à l&#8217;apéro au moment d&#8217;écrire ces lignes&#8230;).<br />
J&#8217;aurais préféré me retrouver avec un nouvel outil un peu différent, genre des ciseaux.</p>
<p>Bien sûr, je peux sans doute m&#8217;en prendre en grande partie à moi même, je n&#8217;ai jamais remis la même énergie que pendant mes 3 années passées sur symfony. Peut-être que je passe à côté de quelque chose ! Jémémy me dirait (et me dira ;)) certainement que oui&#8230; </p>
<p>Et puis la communauté me manque ! Je suivais (suit encore en fait ;)) l&#8217;actualité, blog, twitter qui tournent autour de symfony. Celle de Rails et même de Ruby est beaucoup plus petite en France et j&#8217;ai finalement très vite lâché l&#8217;affaire une fois de plus, un peu découragé.</p>
<p>Rajouter à cela, les gems, qui sont très sexy sur le papier mais qui compliquent un peu le côté, je vais mater dans le code comment c&#8217;est foutu de ce petit plugin qui rox, bien sûr le fameux RVM qui ne m&#8217;aime définitivement pas. On ne parlera pas de Passenger qui a lui aussi ses petits caprices de temps en temps, ou bien le fait qu&#8217;il faille redémarrer l&#8217;appli pour qu&#8217;un changement dans une lib soit pris en compte (mais apparemment que sur ma machine :( )</p>
<p>Des détails me direz vous ! Oui c&#8217;est clair, des broutilles auquel on est confronté tous les jours dans notre métier de développeur. Et le changement forcé de mes petites habitudes de bidouilleur PHP n&#8217;a pas du arranger les choses.</p>
<p>Je ne rentre volontairement pas dans le côté technique à comparer deux outils qui font leur job. Parce que pour le coup, la différence ne se fait pas là pour moi à mon avis.</p>
<h3>Bilan</h3>
<p>Au final on peut dire que c&#8217;est plus un mauvais feeling et le fait que je sois ravi de symfony et PHP qui font que j&#8217;accroche pas. J&#8217;ai passé et donné beaucoup de mon temps sur symfony et PHP et je n&#8217;ai pas été déçu, finalement je me dis que quelque part, je les trompe un peu &#8230; ;)</p>
<p>Et puis Symfony2 est arrivé&#8230; J&#8217;ai décortiqué les bétas, testé et retesté, lu le code. Et l&#8217;excitation de m&#8217;en servir grandit chaque jour ! Définitivement, une question de feeling donc. Et aussi parce que j&#8217;ai eu l&#8217;impression de progresser dans mon métier avec symfony1, et cette même sensation m&#8217;envahit quand je vois Symfony2. Ruby / Rails ne m&#8217;ont permis que de me diversifier&#8230;</p>
<p>Attention, je reste quand même ravi d&#8217;avoir pu goûter à ce changement. Ça aura au moins eu le mérite me confronter à autre chose justement, un environnement quasi entier qui diffère ! Je rajoute aussi une corde à mon arc, sait-on jamais hein&#8230;</p>
<p>Et ça m&#8217;aura permis aussi de me conforter, malgré toute la mauvaise presse qu&#8217;il se traine, dans l&#8217;idée que moi je l&#8217;aime bien mon PHP :p</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/php-symfony-ruby-rails-un-an-apres/2011/06/28/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Symfony Live 2011 : Compte rendu des 2 jours</title>
		<link>http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/</link>
		<comments>http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 10:00:49 +0000</pubDate>
		<dc:creator><![CDATA[Tim]]></dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[twig]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1725</guid>
		<description><![CDATA[Nous voilà donc rentrés du 3e Symfony Live, toujours à la Cité Universitaire de Paris, et cette année les 2 jours sous le soleil! Bon le froid était quand même là hein, ça reste Paris :D Voici donc un petit compte rendu des 2 jours pour ceux qui n&#8217;étaient pas présents. A noter que cette [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/"><img src="http://www.amicalement-web.net/wp-content/uploads/sflive20111.jpg" alt="" title="sflive2011" width="614" height="100" class="alignnone size-full wp-image-1739" /></a><br />
Nous voilà donc rentrés du 3e Symfony Live, toujours à la Cité Universitaire de Paris, et cette année les 2 jours sous le soleil! Bon le froid était quand même là hein, ça reste Paris :D Voici donc un petit compte rendu des 2 jours pour ceux qui n&#8217;étaient pas présents. A noter que cette année, on avait le droit à 2 salles, donc 2 interventions en même temps, il a fallut faire des choix!<br />
<span id="more-1725"></span></p>
<p>La conf tombait bien vu que la première Release Candidate de Symfony2 approche à très grand pas, c&#8217;était l&#8217;occasion d&#8217;aborder abondamment ce nouveau framework pour ceux qui n&#8217;avaient pas eu encore l&#8217;occasion (ou le courage ^^) de se jeter dedans. Les différentes interventions étaient donc principalement orientées autour de 2 axes, Symfony2 en tant que tel, et le passage de symfony 1 à Symfony2 forcément.</p>
<h3>Première journée</h3>
<h4>The lost art of Simplicity</h4>
<p>Josh Holmes, un employé de Microsoft, est venu nous parler de la simplicité dans le développement. C&#8217;est un bon orateur, la conf n&#8217;était pas technique du tout, &#8220;juste&#8221; de l&#8217;ouverture d&#8217;esprit. Même si je n&#8217;ai globalement pas appris grand chose de nouveau, cette conf Microsoft était bien mieux que celle de l&#8217;an dernier, et pas cruciale pour ceux qui sont arrivés en retard (suivez mon regard :D). Un bon début donc.<br />
<a  href="http://www.slideshare.net/joshholmes/the-lost-art-of-simplicity" rel="extern">Voir les slides</a></p>
<h4>Application Security</h4>
<p>Un gros morceau du code Symfony2 et une partie toujours très critique d&#8217;un framework. C&#8217;est Johannes Schmitt qui a reprit le flambeau après la première version du composant par Fabien. On a vu voir un très gros refactoring depuis les premières versions, ca a l&#8217;air bien fichu mais mon dieu que c&#8217;est devenu énorme comme brique!</p>
<p>Malheureusement on ne peut pas vraiment dire que Johannes est un grand showman comme on a pu en croiser, et il s&#8217;est &#8220;contenté&#8221; consciencieusement de faire une revue des différents mécanismes du composant. Un peu de regrets donc, sur ce gros morceau, peu d&#8217;exclu pour ceux qui ont déjà parcouru la doc et le code source.</p>
<h4>State of the CMF Project</h4>
<p>Lukas, le &#8220;lead&#8221; du projet est venu nous présenter quels étaient les buts du projet, quelles entreprises étaient impliqués et ce qui avait déjà été fait. L&#8217;idée est bonne : axer le développement sur la résolution des problèmes des développeurs (d&#8217;où le CMF : Content Management Framework) et réaliser ensuite un CMS complet avec les briques du CMF. Un petit hic : le moteur de stockage des données est basé sur une spec et un soft Java (Jackrabbit), et un backend PHP ne verra probablement pas le jour. Voir <a  href="http://www.devorigin.fr/articles/to-jcr-or-not-choosing-the-right-persistence-solution-for-the-symfony-cmf">mon post</a> sur ce sujet.</p>
<p>Il y aura à mon avis une place pour une alternative plus &#8220;conventionnelle&#8221;, ie. que les gens normaux et les petites entreprises pourront utiliser.<br />
Vous trouverez <a  href="https://github.com/symfony-cmf/symfony-cmf/blob/master/docs/slides.html">les slides sur GitHub</a>.</p>
<h4>Apostrophe: a Symfony Powered CMS</h4>
<p>Aucun de nous n&#8217;était présent, je vous laisse jeter un œil <a  href="http://www.slideshare.net/tompunk/apostrophe-improved-paris-edition" rel="extern">aux slides</a> du coup.</p>
<h4>RESTful avec symfony et Symfony</h4>
<p>Xavier Lacot et Damien Alexandre de chez Cleverage ont débarqué avec leur Poney pour nous présenter l&#8217;implémentation à faire dans les 2 versions de symfony pour faire du vrai bon REST. Présentation complète vu qu&#8217;ils sont allés jusqu&#8217;à faire quelques benchmarks et nous ont gratinés de quelques slides bien fun ;)<br />
Toute leur présentation sur : <a  href="http://symfpony-project.org/" rel="etern">http://symfpony-project.org/</a></p>
<h4>Contributing with GIT</h4>
<p>GIT était encore là, et c&#8217;était encore Scott Chacon qui s&#8217;est collé à la lourde tâche de le présenter. Et encore une fois, ce fut avec classe! Scott est vraiment un très bon conférencier (ca se dit? :x) et il est, cette fois, allé plus loin que la simple présentation du SCM, la présentation a également englobé les modes de contributions à GIT. Très complet là dessus et introduisant également le workflow de contribution de github!</p>
<h4>Speedy App</h4>
<p>Encore un choix à faire, on y était pas. <a  href="http://www.slideshare.net/caillou/speedy-app-frontend-performance-considerations">Les slides</a></p>
<h4>Embed sf1 in SF2</h4>
<p>Explication d&#8217;un cas réel, l&#8217;express.fr. Présentation du pourquoi ce choix technique. Le code source reste le plus parlant pour voir l’intérêt. Au final peu de lignes de code à rajouter dans l&#8217;appli sf1 pour transformer les réponses en object Response pour sf2 et ainsi bénéficier de la couche Cache de Symfony2.</p>
<p>Un moindre mal pour les applis encore en symfony mais qui voudrait tirer parti de quelques avantages de Sf2.<br />
<a  href="http://www.slideshare.net/futurecat/nice-performance-using-sf2-cache-wrapping-sf1-application-paris">Voir les slides</a></p>
<h4>Symfony2 : 30 astuces</h4>
<p>Noël s&#8217;est attaqué à passer en revue, les bonnes pratiques et astuces à garder en mémoire pour les futurs dev Symfony2.<br />
<a  href="http://www.slideshare.net/noelguilbert/symfony2-30-astuces-et-bonnes-pratiques">Voir les slides</a></p>
<h4>phpBB4</h4>
<p>Sympathique présentation par le lead développeur de phpbb, il y a 10ans déjà. Rétrospective de l&#8217;évolution du système de plugins pour aboutir finalement au choix de baser la prochaine version sur Symfony2:<br />
<a  href="http://prezi.com/3qkzfgmhrajd/symfony-live-2011-paris-phpbb4-building-end-user-applications-with-symfony2/">Voir les slides</a></p>
<h4>Forms in sf2</h4>
<p>Bernhard qui est à l&#8217;origine du composent Form, a pris un peu tout le monde a contre pied en présentant la dernière mouture du composant, qui n&#8217;est pas encore mergé dans le master. L&#8217;optique ici est de passer les configurations de formulaire via le DIC pour pouvoir tester les contrôleurs sans les forms.<br />
Autre avantage, la partie render est maintenant séparée également. Pour avoir plus de détails sur le pourquoi du comment, hésitez pas à jeter un oeil sur la discussion qu&#8217;il a lancé sur <a  href="http://groups.google.com/group/symfony-devs/browse_thread/thread/58789255fae7a3be/ea756826ba286f6c?hl=fr#ea756826ba286f6c" rel="extern">la mailing list</a>.</p>
<p>Bon il assure que tout le process d&#8217;embed form est plus au point que dans symfony 1, comme beaucoup, tellement traumatisé, je vais attendre de le voir pour le croire :D</p>
<p><a  href="http://www.slideshare.net/bschussek/leveraging-symfony2-forms">Voir les slides</a></p>
<h4>Keynote</h4>
<p>Voilà Fabien sur la scène, sans slides prêt à présenter en live Symfony2. Quelques modifications de son installation un peu tardives ont provoquées 15min de debug en live! Quelques sueurs froides, on a même cru qu&#8217;il allait renoncer! Mais finalement, c&#8217;était tout simplement un vhost mal configuré :)<br />
Sur le contenu, il a voulu montrer que Symfony2 était vraiment simple à appréhender et que le système d&#8217;annotation présent via le FrameworkExtraBundle était vraiment &#8220;cool&#8221;. Donc rien de nouveau en soit, pour tout ceux qui ont déjà eu l&#8217;occasion de manipuler la bête.</p>
<p>Perso, j&#8217;avoue avoir quelques réticences avec tout ces systèmes d&#8217;annotations, très à la mode en ce moment. Peut-être parce que c&#8217;est pas natif, ou peut-être parce que j&#8217;aime bien avoir les choses à leur place, et pas tout au même endroit. Différente vision certainement!</p>
<h3>Deuxième jour</h3>
<h4>Adopt devops philosophy</h4>
<p>Les croissants ont été les plus forts, on y était donc pas:<br />
<a  href="http://www.slideshare.net/fabrice.bernhard/adopt-devops-philosophy-on-your-symfony-projects">Voir les slides</a></p>
<h4>Symfony2 from the trenches</h4>
<p>Du coup celle là non plus:<br />
<a  href="https://docs.google.com/present/view?id=dfzg6stg_8fp9jksfw">Voir les slides</a></p>
<h4>Assetic</h4>
<p>L&#8217;occasion de découvrir le dernière né des bundles intégré de base dans Symfony2. J&#8217;ai suivi de loin la conf pour commencer à mettre au propre ce billet. Mais les slides parlent d&#8217;elles mêmes! Assetic, c&#8217;est vraiment orienté pour faciliter la vie des developpeurs.<br />
<a  href="http://www.slideshare.net/kriswallsmith/assetic-symfony-live-paris">Voir les slides</a></p>
<h4>Application Gruyere</h4>
<p>Une nouvelle conf qu&#8217;on a pas pu suivre.</p>
<h4>HTTP Cache</h4>
<p>Fabien revient pour nous parler certainement d&#8217;une des features vraiment &#8220;militante&#8221; (entendre par là, que peu de framework l’utilisent actuellement). Pour lui, le meilleur système de cache est donc de passer par la spécification HTTP qui définit tout un tas de convention pour faire du cache.</p>
<p>Il a donc passé en revue les différents mécanismes de cache via HTTP mais trop de choses à dire donc pas assez de temps pour rentrer dans le code plus en profondeur. Ça promet en tout cas pas mal de prise de tête car du coup la méthode de cache à utiliser revient au développeur! Et même si je reste convaincu déjà depuis pas mal de temps que le cache HTTP c&#8217;est bien, être au pied du mur, ça fait un peu peur :p</p>
<h4>Solr</h4>
<p>J&#8217;aurais bien aimé voir la conf, mais finalement faut faire des choix encore et toujours! Une présentation que vous pouvez <a  href="http://www.slideshare.net/th0masr/integrating-the-solr-search-engine" rel="extern">retrouver ici</a></p>
<h4>Varnish</h4>
<p>Un bon tour du propriétaire, fait par un orateur très fun, très blagueur qui m&#8217;a donné envie d&#8217;aller plus loin! En tout cas Varnish ca a l&#8217;air cool, mais surtout si on en a l&#8217;utilité en fait&#8230;</p>
<h4>Quid de mes applications sf1</h4>
<p>Marc Hugon a du se contenter de la petite salle pour parler pourtant d&#8217;un sujet qui intéressait à mon avis beaucoup de monde. La migrations des applis sf1 vers Sf2. J&#8217;ai pas pu rentrer donc faut matter <a  href="http://www.slideshare.net/marchugon/quid-de-vos-applications-symfony-1">les slides</a>.</p>
<h4>Twig</h4>
<p><a  href="http://www.slideshare.net/weaverryan/being-dangerous-with-twig-symfony-live-paris">Voir les slides</a></p>
<h4>Symfony2 en pièces détachés</h4>
<p>Une grande revue des différents composants présent dans le core de Symfony2 et qui sont utilisables de façon indépendante. Rien de neuf en soit, mais un bon rappel qu&#8217;avant de faire son propre composant, ça vaut le coup de jeter un œil à ces composants là!<br />
<a  href="http://www.slideshare.net/hhamon/symfony2-en-pices-dtaches">Voir les slides</a></p>
<h4>Doctrine</h4>
<p><a  href="http://www.slideshare.net/mobile/jwage/doctrine-intherealworldsf-live2011sanfran#1">Voir les slides</a></p>
<h4>Javascript, Event and Scopes</h4>
<p>Une présentation très sympa qui met en lumière les bonnes pratiques à utiliser pour développer à base d&#8217;event. Comme l&#8217;utilisation du preventDefault() ou encore la différence entre le bubbling et la capture. Suivi ensuite d&#8217;un gros rappel sur la portée des variables et les pièges à éviter dans leur nommage. </p>
<p>Sachant que pour de développeurs web, le javascript a toujours été de la &#8220;bidouille&#8221; c&#8217;est toujours bon d&#8217;avoir des rappels de bonne pratique, même si encore une fois, rien de neuf sous le soleil.<br />
<a  href="http://slides.seld.be/?file=2011-03-04+JavaScript+Events+and+Scopes.html#1">Voir les slides</a></p>
<h4>BDD : Behavior Driven Development</h4>
<p>Voilà une des confs qui a vraiment abordé un sujet trop souvent mis de côté et de très belle façon. Konstantin (plus connu sous le pseudo everzet) a expliquer très simplement en quoi consistait la méthodologie BDD qui n&#8217;est finalement qu&#8217;une extension du célèbre TDD. Puis a mis en lumières les outils qu&#8217;il a développé pour faciliter le travail de chacun.<br />
Clairement une très bonne surprise et une nouvelle étape pour faciliter cette partie du métier de développeur.<br />
<a  href="http://www.slideshare.net/everzet/bdd-in-symfony2">Voir les slides</a></p>
<h4>Jeux sociaux et Cloud</h4>
<p>Weka qu&#8217;on a vu pas mal en tant que sponsor de l&#8217;évènement a pu exposer un peu son domaine de prédilection. On attend les slides!</p>
<h4>Don&#8217;t use a screw when you need a nail</h4>
<p>Derrière ce titre, se cachait en fait, Stefan (Skoop) qui a parfaitement résumé ce que tout développeur devrait faire : Chercher les solutions les plus pertinentes en fonction de vos besoins. En faisant un rapide tour des technos non PHP qui répondent à des besoins communs, comme le search, un bug tracker, etc &#8230; il a montré que le développement c&#8217;est une grande famille et qu&#8217;il y a parfois la solution à votre problème pas si loin que ça ;)<br />
<a  href="http://www.slideshare.net/skoop/dont-use-a-screw-when-you-need-a-nail-symfony-live-paris-2011">Voir les slides</a></p>
<h4>Iscool Story</h4>
<p>On attend les slides!</p>
<h4>Keynote : one more thing</h4>
<p>Musique, effet de lumière, vidéo, Fabien a le mérite de jouer l&#8217;auto dérision parfaitement en commençant la keynote par l&#8217;annonce de la &#8230; Symfony Tablet! Finalement, pour ceux qui ont pas vu la conf retransmise en live apparemment, 3 grandes annonces:</p>
<ul>
<li>Symfony2 aura un système d&#8217;installer à la wordpress. Il semble aussi simple d&#8217;utilisation!</li>
<li>Symfony2 aura un système de distributions qui embarquera une conf par défaut différente en fonction des cas d&#8217;utilisation</li>
<li>Nouvelle marque! Symfony se dote d&#8217;un nouveau ndd, un nouveau site et un nouveau logo : <a  href="http://symfony.com">Voir le nouveau site</a></li>
</ul>
<p>Rien de révolutionnaire, mais on peut noter l&#8217;effort sur le site web, beaucoup plus clair, simple et actuel niveau graphique. Et surtout l&#8217;accent mis sur la simplification de Symfony2 auprès des débutants. Fabien a semble-t-il l&#8217;intention de &#8220;banaliser&#8221; au maximum Symfony2 pour montrer qu&#8217;on peut faire beaucoup de choses assez simplement avec. Et si c&#8217;est pour faire reculer des choses comme joomla, on ne peut qu&#8217;espérer que ca fonctionne un peu ;)</p>
<h3>Unconférence</h3>
<p>Vendredi, Skoop a également mis en place un partie &#8220;unconférence&#8221;, entendre par là, une conférence un peu informelle. L&#8217;idée est super, mais encore une fois, ce ne faisait que compliquer les choix :p </p>
<p>Vous pouvez retrouver le détails des présentations sur le <a  href="https://docs.google.com/document/pub?id=1rXrCNX25JArMq5TEHJOFiJjnmsKjRX4JpUoFxTXqob0&#038;pli=1">récap de Jonathan</a></p>
<h3>Bilan</h3>
<p>Bah c&#8217;était cool! Forcément ;)</p>
<ul>
<li>Toujours un peu déçu quand on tombe sur une conf qui finalement ne pas plus loin de ce qu&#8217;on est déjà allé. Mais fallait bien que les gens qui n&#8217;ont pas encore touché le nouveau joujou puissent suivre j&#8217;imagine!</li>
<li>Assez bluffé par l&#8217;équipe de traduction en langage de signes. Deux dames pour 4 malentendants (je crois). J&#8217;imagine pas le bagage technique qu&#8217;il faut pour réussir à traduire ce genre de conférence, chapeau!</li>
<li>Un peu déçu de pas avoir eu un badge avec un joli tour de cou :x Réduction de coût pour les invités?</li>
<li>Toujours aussi charmé par l&#8217;endroit, si j&#8217;avais pu faire mes études dans le coin!</li>
<li>Merci pour le soleil!</li>
<li>Le gros point noir, reste finalement le wifi. Une vrai galère pour arriver à la page de login. D&#8217;où la publication tardive de ce billet et un niveau de tweet en dessous de ce qui était prévu!</li>
</ul>
<p>Ravi d&#8217;avoir pu rencontrer (ou revu) pas mal de gens, et surtout l&#8217;équipe <a  href="http://www.knplabs.com">knplabs</a> qui m&#8217;a gentiment permis de squatter avec eux :p Bon ya pas mal de tête que j&#8217;ai même pas vu voir de loin! Mais ce n&#8217;est que partie remise!</p>
<p><small>Crédit photo : http://www.flickr.com/photos/xavierbriand/5494245376</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony2 : créer un admin sécurisé</title>
		<link>http://www.amicalement-web.net/symfony2-creer-un-admin-securise/2010/12/23/</link>
		<comments>http://www.amicalement-web.net/symfony2-creer-un-admin-securise/2010/12/23/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 10:00:25 +0000</pubDate>
		<dc:creator><![CDATA[Tim]]></dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1603</guid>
		<description><![CDATA[Non je ne suis pas mort ! Une grosse année qui arrive à son terme et qui m&#8217;aura un peu éloigné du blog ces derniers mois, mais me voilà de retour aux affaires avec la sortie imminente de Symfony2. J&#8217;ai donc décidé de monter un petit site pour tester en conditions réelles ce nouveau framework. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony2-creer-un-admin-securise/2010/12/22/"><img src="http://www.amicalement-web.net/wp-content/uploads/Sans-titre-3.png" alt="" title="Sans-titre-3" width="614" height="100" class="alignnone size-full wp-image-1617" /></a><br />
Non je ne suis pas mort ! Une grosse année qui arrive à son terme et qui m&#8217;aura un peu éloigné du blog ces derniers mois, mais me voilà de retour aux affaires avec la sortie imminente de Symfony2. J&#8217;ai donc décidé de monter un petit site pour tester en conditions réelles ce nouveau framework. Et tant qu&#8217;à débroussailler le terrain, autant faire partager mes difficultés.</p>
<p>L&#8217;idée dans le tuto d&#8217;aujourd&#8217;hui est de faire un petit point sur la partie &#8220;security&#8221; très bien documentée sur le site officiel mais qui change assez des habitudes de symfony 1 et donc semble un peu déroutante au début.<br />
<span id="more-1603"></span></p>
<blockquote><p>
Ce billet est issu de ma propre et récente expérience sur le sujet et sur la branche master de fabien. Les choses peuvent changer ou être inexactes. Dans ce dernier cas, n&#8217;hésitez pas à me reprendre via les commentaires ;)
</p></blockquote>
<h3>Contexte</h3>
<p>Pour l&#8217;illustration, je vais simplement partir de la sandbox officielle d&#8217;origine configurée sur l&#8217;url suivante en local chez moi :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>sandbox.local</pre></div></div>

<p> et où je vais vous montrer comment y intégrer votre admin avec un formulaire d&#8217;identification sur l&#8217;url suivante :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>sandbox.local<span style="color: #000000; font-weight: bold;">/</span>admin<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>L&#8217;utilisateur sera géré directement via la config, pas de bdd, on veut quelque chose de très simple et rapide à mettre en place.</p>
<p>Première chose à comprendre dans une application Symfony2, il n&#8217;y a plus qu&#8217;une application&#8230; Oui hein, ça parait fou dis comme ça :D Toute la séparation se situe au niveau des bundles, chacun d&#8217;eux pouvant embarquer des modèles, controllers, vues différentes, tout en pouvant communiquer avec les autres bundles. Fini les galères pour faire des liens entre un backend et un frontend !</p>
<p>Pour notre admin, nous allons donc générer un nouveau bundle dans notre application via la commande :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">php app<span style="color: #000000; font-weight: bold;">/</span>console init:bundle Application<span style="color: #000000; font-weight: bold;">/</span>AdminBundle</pre></div></div>

<p>On se retrouve donc avec un controller basique dans ce bundle qui sera la base de notre admin. Première chose à faire, l&#8217;activer dans le fichier <code>app/AppKernel.php</code> via la méthode <code>registerBundles</code>.</p>
<h3>Mise en place url admin</h3>
<p>On va maintenant tenter d&#8217;y accéder via l&#8217;url <code>/admin/</code></p>
<p>Pour ça, c&#8217;est très simple ! On va modifier notre fichier routing.yml (ou xml ou php hein, mais moi j&#8217;aime bien le yml ! ) comme ceci :</p>

<div class="wp_syntax"><div class="code"><pre class="json" style="font-family:monospace;">#path:app/config/routing.yml
&nbsp;
homepage:
    pattern:  /
    defaults: { _controller: FrameworkBundle:Default:index }
&nbsp;
hello:
    resource: HelloBundle/Resources/config/routing.yml
&nbsp;
admin:
   resource: AdminBundle/Resources/config/routing.yml
   prefix: /admin</pre></div></div>

<p>et du coup créer le fichier de routing de notre nouveau AdminBundle. Pour ça, on va faire quelque chose de très simple aussi:</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;">#src/Application/AdminBundle/Resources/config/routing.yml
admin_homepage:
  pattern:  /
  defaults: { _controller: AdminBundle:Default:index }</pre></div></div>

<p>Et par magie, maintenant, si vous accédez à l&#8217;url :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>sandbox.local<span style="color: #000000; font-weight: bold;">/</span>admin<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Vous obtenez le mot &#8220;Hello&#8221; qui n&#8217;est d&#8217;autre que la vue par défaut qui a été générée par la commande <code>init:bundle</code><br />
Pour pas se perdre, on va modifier la vue, pour y indiquer le mot admin, ca sera plus clair.</p>
<h3>Sécuriser l&#8217;url d&#8217;admin</h3>
<p>2e étape, comment sécuriser tout ça pour ne pas laisser tout le monde accéder à votre admin. Pour ça il y a en fait plusieurs solutions.</p>
<ul>
<li>Sécuriser toutes les urls de votre application, en autorisant les connexions anonymes partout, sauf dans votre admin</li>
<li>Sécuriser toutes les urls de votre admin seulement</li>
</ul>
<p>La 1ere a l&#8217;avantage de faire écrire très peu de ligne de config, mais honnêtement, je ne sais pas s&#8217;il y en a une de meilleure que l&#8217;autre, donc je présente la première dans ce tuto, mais je vous met le code de la deuxième à la fin. Elles font sensiblement la même chose.</p>
<p>On va donc se lancer dans la config du component security. Pour ça, on se retrouve dans notre <code>config.yml</code> pour y ajouter un provider, qui sera en fait le compte utilisateur de notre admin.</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">#app/config/config.yml
security.config:
  providers:
    admin:
      users:
        monadmin: { password: monpass, roles: ROLE_ADMIN }</pre></div></div>

<p>Nous voici avec un compte &#8220;monadmin&#8221; identifié grâce au mot de passe &#8220;monpass&#8221; qui sera crédité de l&#8217;autorisation &#8220;ROLE_ADMIN&#8221; (pour pourriez mettre TOTO à la place de ADMIN, ca changerait rien, par contrel mot ROLE est apparemment obligatoire) </p>
<p>Pour l&#8217;instant, ca ne change rien. Définissons maintenant une règle firewall ! Le mot utilisé pour définir ce nouveau service fait sourire j&#8217;avoue, en fait il s&#8217;agit de définir des règles de sécurité pour des motifs d&#8217;urls.</p>
<p>On reste dans notre config.yml qu&#8217;on enrichit comme ceci:</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">#app/config/config.yml
security.config:
  providers:
    main:
      users:
        monadmin: { password: monpass, roles: ROLE_ADMIN  }
&nbsp;
  firewalls:
    admin:
      pattern: .*
      http_basic: true</pre></div></div>

<p>Et là, vous obtenez normalement une demande d&#8217;authentification HTTP sur tout votre site. Ok! Maintenant, on va autoriser des connexions anonymes, c&#8217;est à dire qu&#8217;on ne va pas forcer les gens à se connecter:</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">#app/config/config.yml
security.config:
  providers:
    main:
      users:
        monadmin: { password: monpass, roles: ROLE_ADMIN }
&nbsp;
  firewalls:
    admin:
      pattern: .*
      http_basic: true
      anonymous: true</pre></div></div>

<p>Maintenant, voyons voir pour mettre en place un formulaire plus conventionnel (et il me semble plus secure si bien fait, mais à confirmer).</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">#app/config/config.yml
security.config:
  providers:
    main:
      users:
        monadmin: { password: monpass, roles: ROLE_ADMIN }
&nbsp;
  firewalls:
    admin:
      pattern: .*
      form_login: true
      anonymous: true</pre></div></div>

<p>Ici on a changé le mode d&#8217;authentification pour celui d&#8217;un formulaire classique, grâce à l&#8217;option <code>form-login</code></p>
<p>Maintenant, on va verrouiller l&#8217;accès à notre admin. Pour ce faire, on va demander une autorisation pour notre url <code>/admin</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">#app/config/config.yml
security.config:
  providers:
    main:
      users:
        monadmin: { password: monpass, roles: ROLE_ADMIN }
&nbsp;
  firewalls:
    admin:
      pattern: .*
      form_login: true
      anonymous: true
&nbsp;
  access_control:
      - { path: /admin/.*, role: ROLE_ADMIN }</pre></div></div>

<p>Et maintenant, si vous essayez d&#8217;accéder à l&#8217;url :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>sandbox.local<span style="color: #000000; font-weight: bold;">/</span>admin<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Vous êtes redirigés vers l&#8217;url:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>sandbox.local<span style="color: #000000; font-weight: bold;">/</span>login<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>qui se termine en 404! Jusqu&#8217;ici c&#8217;est normal.</p>
<p>Symfony2 par défaut, utilise 3 urls pour la gestion de l&#8217;authentification :</p>
<ul>
<li>login</li>
<li>login_check</li>
<li>logout</li>
</ul>
<p>Nous allons donc les rajouter dans notre routing.yml tout simplement. Attention de bien les mettre au début, histoire d&#8217;éviter tout conflit avec une autre de vos règles.</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">_security_login:
  pattern: /login
  defaults: { _controller: AdminBundle:Default:login }
&nbsp;
_security_check:
  pattern: /login_check
&nbsp;
_security_logout:
    pattern: /logout</pre></div></div>

<p>Le login a besoin de nous pour constituer le formulaire d&#8217;identification, les 2 autres doivent seulement exister ! Les patterns des urls peuvent varier, mais il faut alors donner les nouveaux paths dans le config.yml, nous verrons ça plus tard.</p>
<p>Maintenant, si nous accédons à notre admin nous avons bien sûr l&#8217;exception suivante:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Method <span style="color: #0000ff;">&quot;Application\AdminBundle\Controller\DefaultController::loginAction&quot;</span> does not exist<span style="color: #339933;">.</span></pre></div></div>

<p>On la crée donc:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// src/Application/AdminBundle/Controller/DefaultController.php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">namespace</span> Application\AdminBundle\Controller<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Symfony\Bundle\FrameworkBundle\Controller\Controller<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Symfony\Component\Security\SecurityContext<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// à rajouter</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> DefaultController <span style="color: #000000; font-weight: bold;">extends</span> Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'AdminBundle:Default:index.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> loginAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
       <span style="color: #666666; font-style: italic;">// get the error if any (works with forward and redirect -- see below)</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">attributes</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">has</span><span style="color: #009900;">&#40;</span>SecurityContext<span style="color: #339933;">::</span><span style="color: #004000;">AUTHENTICATION_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">attributes</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span>SecurityContext<span style="color: #339933;">::</span><span style="color: #004000;">AUTHENTICATION_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSession</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span>SecurityContext<span style="color: #339933;">::</span><span style="color: #004000;">AUTHENTICATION_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'AdminBundle:Default:login.twig'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #666666; font-style: italic;">// last username entered by the user</span>
          <span style="color: #0000ff;">'last_username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSession</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span>SecurityContext<span style="color: #339933;">::</span><span style="color: #004000;">LAST_USERNAME</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'error'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$error</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Donc là, j&#8217;ai simplement récupéré le code fourni dans la doc officielle, pas de mystère non plus. Et voici la vue correspondante :</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;form</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;{% path &quot;</span>_security_check<span style="color: #ff0000;">&quot; %}&quot;</span> <span style="color: #000066;">method</span>=<span style="color: #ff0000;">&quot;post&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
  {% if error %}
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;notification error png_bg&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			{{ error }}
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  {% endif %}
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Username<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;text-input&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;_username&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;{{ last_username }}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Password<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;text-input&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;password&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;_password&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;remember-password&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;checkbox&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>Remember me
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;login&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Sign In&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Là aussi, très basique mais ça vous donne l&#8217;occasion d&#8217;essayer twig ;) Ce qui compte pour le coup, c&#8217;est surtout les attributs name des input (_username et _password), et de rediriger vers <code>/login_check</code></p>
<blockquote><p>
A noter que l&#8217;utilisation du tag path dans la dernière version de twig n&#8217;est plus d&#8217;actualité. C&#8217;est désormais une fonction, donc à utiliser comme ceci {{ path(&#8216;_security_check&#8217;) }}
</p></blockquote>
<p>Alors oui, il faudrait un layout et tout, mais bon, on va aller droit à l&#8217;essentiel.</p>
<p>On retrouve bien notre formulaire de login maintenant, si on essaye d&#8217;accéder à notre admin ! Encore mieux, si on essaye de s&#8217;authentifier, avec le couple login/password défini au début, on obtient notre page &#8220;admin!&#8221; Et il suffit d&#8217;ajouter une dernière ligne à notre config, pour ajouter le listener manquant sur le <code>/logout</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">#app/config/config.yml
security.config:
  providers:
    main:
      users:
        monadmin: { password: monpass, roles: ROLE_ADMIN }
&nbsp;
  firewalls:
    admin:
      pattern: .*
      form_login: true
      anonymous: true
      logout: true
&nbsp;
  access_control:
      - { path: /admin/.*, role: ROLE_ADMIN }</pre></div></div>

<p>Et maintenant, vous pouvez vous déloguer sur l&#8217;url :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>sandbox.local<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">logout</span></pre></div></div>

<p>Histoire d&#8217;illustrer un peu plus, voici une autre config qui fonctionne aussi et qui permet de ne sécuriser que l&#8217;admin:</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">security.config:
  providers:
    main:
      users:
        monadmin: { password: monpass, roles: ROLE_TOTO }
&nbsp;
  firewalls:
    admin: { pattern: /admin/.*, form_login: true }
    login: { pattern: /login, anonymous: true, form_login: true }
    login_check: { pattern: /login_check, anonymous: true, form_login: true }
    logout: { pattern: /logout, form_login: true, logout: true }
&nbsp;
  access_control:
       - { path: /admin/.*, role: ROLE_TOTO }</pre></div></div>

<p>Il y a bien sûr, beaucoup de tuning possible, pour encoder le password par exemple, mais maintenant qu&#8217;on a la base, je vous laisse <a  href="http://docs.symfony-reloaded.org/guides/security/index.html" rel="extern">lire vraiment la doc</a> entière cette fois-ci ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony2-creer-un-admin-securise/2010/12/23/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>symfony 1, Symfony2 et Django sont dans un bateau</title>
		<link>http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/</link>
		<comments>http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 12:44:41 +0000</pubDate>
		<dc:creator><![CDATA[Vince]]></dc:creator>
				<category><![CDATA[Réflexion]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1481</guid>
		<description><![CDATA[Je développe sous symfony 1 depuis quelques temps et jusqu&#8217;ici j&#8217;en étais plutôt content. La dernière version majeure date de novembre 2009, nous en fêtons les 1 an ce mois-ci. Alors certes c&#8217;est un bel anniversaire un an, mais quand on sait que la prochaine version majeure sera Symfony2, prévue pour Mars 2011, ça peut [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/"><img src="http://www.amicalement-web.net/wp-content/uploads/bateau.jpg" alt="" title="bateau" width="614" height="100" class="aligncenter size-full wp-image-1505" /></a><br />
Je développe sous <strong>symfony 1</strong> depuis quelques temps et jusqu&#8217;ici j&#8217;en étais plutôt content. La dernière version majeure date de <strong>novembre 2009</strong>, nous en fêtons les 1 an ce mois-ci. Alors certes c&#8217;est un bel anniversaire un an, mais quand on sait que la prochaine version majeure sera <strong>Symfony2, prévue pour Mars 2011</strong>, ça peut faire peur. Petit avis <strong><em>personnel</em></strong>.<br />
<span id="more-1481"></span></p>
<h3>[s|S]ymfony : un homme</h3>
<p>[s|S]ymfony c&#8217;est un homme, une vision : <strong>Fabien Potencier</Strong>. Il y a certes une belle communauté autour, Kris qui s&#8217;occupe des release de la 1.4 notamment, Jon qui était embauché par Sensio pour Doctrine, mais c&#8217;est Fabien qui a toujours <strong>dirigé le développement</strong> du Framework. Depuis quelques temps déjà, Fabien est passé sur le développement de Symfony2, et a donc arrêté tout nouveau développement sur symfony 1. La conséquence immédiate est <strong>l&#8217;absence de quelconque nouveauté depuis plus d&#8217;un an sur symfony 1</strong>, et ce encore pour plusieurs mois.<br />
Alors oui on nous explique que symfony 1.4 marche, certes, mais il continuera donc de se trainer ses défauts jusqu&#8217;à la fin de sa vie : Admin generator qui est là pour faire bien, forms imbriqués qui sont le cauchemard de tout développeur symfony, &#8230; On va aussi vous dire : mais t&#8217;as qu&#8217;à contribuer (oui vous savez, la réponse ultime de toute discussion open source non constructive) ! Le souci c&#8217;est que généralement quand on utilise un Framework, c&#8217;est pour <strong>gagner du temps</strong>, pas pour passer son temps à le développer (je me place du point de vue utilisateur, le cas spécial du contributeur core n&#8217;est pas traité ici). On peut contribuer avec des plugins certes (je suis le premier à le faire dès que je peux), mais pour moi la gestion des forms imbriqués devrait relever du Framework, pas de plugins.</p>
<h3>Ma vision des choses</h3>
<p>Donc si on dresse le tableau après plus d&#8217;<strong>un an de stagnation de symfony 1</strong> :</p>
<ul>
<li>symfony 1 va stagner pendant toute la durée de sa future vie (officiellement novembre 2012)</li>
<li>pour avoir des nouveautés Symfony, il faudra attendre Symfony2 qui est prévu, au plus tôt, Mars 2011</li>
<li>Symfony2 en mars ne sera qu&#8217;une première version, donc loin de toutes les subtilités et fonctionnalités que peut avoir symfony 1</li>
</ul>
<p>Vous allez me dire que ce tableau n&#8217;est pas très réjouissant, j&#8217;en conviens. Ça n&#8217;empêche nullement de démarrer des projets sur symfony 1.4, je le fais encore moi même, mais je pense que ça encourage à <strong>se poser les bonnes questions</strong>. Tiens, peut être qu&#8217;il existerait quelquechose qui pourrait <strong>combler mon manque</Strong>, ma frustration en attendant Symfony2 ? Peut être que je pourrais avoir tout ce que symfony 1 m&#8217;apporte autre part, tout en utilisant quelquechose qui n&#8217;est pas voué à stagner ? Et si en plus je pouvais <strong>apprendre de nouvelles choses</strong>, ça serait top !</p>
<h3>Django, une ouverture d&#8217;esprit ?</h3>
<p>On aime tous évoluer, apprendre (enfin j&#8217;espère), se remettre en question &#8230; Mais beaucoup d&#8217;entre vous ont aussi des objectifs de rentabilité, de sureté vis-à-vis du client. C&#8217;est pourquoi utiliser votre client comme <strong>&#8220;même-pas-alpha-testeur&#8221; de Symfony2</strong>, ça reste encore très risqué et difficile à faire passer à votre direction.<br />
Il existe d&#8217;autres Frameworks, d&#8217;autres langages que le PHP, c&#8217;est peut être l&#8217;occasion, en attendant Symfony2, de les tester sur des projets à faible risque ? En voici quelques un que j&#8217;aimerais tester personnellement : <a  href="http://www.playframework.org/"><strong>Play Framework</strong></a> en Java, <a  href="http://www.djangoproject.com/"><strong>Django</strong></a> en Python et <a  href="http://rubyonrails.org/"><strong>Rails</strong></a> en Ruby. Si vous voulez vraiment avoir un avant goût de Symfony2 et que vous êtes prêts à vous attaquer à la bête, allez voir du côté de <strong><a  href="http://www.springsource.org/">Spring</a></strong> en Java. Même si vous ne les testez que sur un projet, prenez le temps de le faire. Croyez moi, ça vous permettra de prendre du recul, et ça c&#8217;est toujours bon !</p>
<p>Pour ma part, je l&#8217;ai fait pour Django, et j&#8217;en suis très content. On retrouve vite ses petits par rapport à symfony et ça permet de faire un contrastif très intéressant avec symfony. C&#8217;est là qu&#8217;on se rend compte qu&#8217;il arrive, des fois, que l&#8217;herbe soit aussi verte ailleurs (mais pour ça, il faut aller voir).</p>
<p><small>Crédit photo : http://www.flickr.com/photos/clementlivolsi/4566165441/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>La Ferme du Web &#8211; Web Event #2</title>
		<link>http://www.amicalement-web.net/la-ferme-du-web-web-event-2/2010/06/03/</link>
		<comments>http://www.amicalement-web.net/la-ferme-du-web-web-event-2/2010/06/03/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 08:39:41 +0000</pubDate>
		<dc:creator><![CDATA[Benoit]]></dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[la ferme du web]]></category>
		<category><![CDATA[lyon]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[webeventlyon]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1416</guid>
		<description><![CDATA[Le weekend dernier, 29 Mai 2010, avait lieu le Web Event #2 organisé par La Ferme du Web. J&#8217;ai donc quitté ma région nantaise pour me rendre à Lyon afin de participer à l&#8217;évènement mais aussi revoir quelques connaissances ;) En attendant les photos, les discussions détaillés et les vidéos, voici un bref résumé de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/wp-content/uploads/aw_webeventlyon.png"><img src="http://www.amicalement-web.net/wp-content/uploads/aw_webeventlyon.png" alt="" title="aw_webeventlyon" width="614" height="100" class="aligncenter size-full wp-image-1438" /></a></p>
<p>Le weekend dernier, 29 Mai 2010, avait lieu le <a  href="http://event.lafermeduweb.net/">Web Event #2</a> organisé par <a  href="http://www.lafermeduweb.net/">La Ferme du Web</a>. J&#8217;ai donc quitté ma région nantaise pour me rendre à Lyon afin de participer à l&#8217;évènement mais aussi revoir quelques connaissances ;)</p>
<p>En attendant les photos, les discussions détaillés et les vidéos, voici un bref résumé de ce petit weekend lyonnais.</p>
<p><span id="more-1416"></span></p>
<h3>Vendredi 28 Mai 2010</h3>
<p>Il est à 21h05 quand mon train de nuit <em>(oui <a  href="http://twitter.com/savatte">savatte</a>, il roule la nuit et il s&#8217;arrête même des fois ^^)</em> quitte la gare de Nantes direction Lyon.</p>
<p>Quelques épisodes de <abbr title="How I Met Your Mother">HIMYM</a> et beaucoup de ronflements <em>(l&#8217;inconvénient des trains couchettes)</em> plus tard, me voici à Lyon, ville que je n&#8217;avais presque plus vu depuis mon départ il y a 5 ans.</p>
<h3>Samedi 29 Mai 2010</h3>
<p>Il est 6h45 quand je sors du train, direction chez <a  href="http://twitter.com/piouPiouM">piouPiouM</a> et <a  href="http://twitter.com/Le_Piaf_Fou">Le Piaf Fou</a> pour allez prendre le petit dej !! Vers 8h00 j&#8217;arrive a destination (on passera l&#8217;épisode où <del datetime="2010-06-03T06:33:32+00:00">je me suis perdu</del> j&#8217;ai visité la ville :p ) Des retrouvailles très sympa autour d&#8217;un bon petit dej.</p>
<p>Après quelques heures de discussion et une bonne douche, il est temps de partir à Pardieu pour rejoindre un ancien collègue, <a  href="http://twitter.com/kewix">kewix</a> pour manger ensemble. Après 2 bières, kewix arrive enfin et nous allons au <a  href="http://www.rougetendance.fr/situer_ROUGE_TENDANCE_LYON_3eme.html">Rouge Tendance</a> où je prendrais un magnifique Bison Burger :)</p>
<p>Une fois ce succulent repas terminé, kewix nous invite à un flashmob sur la place des terreaux. Ce petit interlude terminé, l&#8217;heure du rendez-vous approche, et pour combler les quelques heures avant le début du Web Event #2, rien de ne vaut une bonne bière en terrasse. Très vite rejoint par savatte puis <a  href="http://twitter.com/karedas">Karedas</a> (il me semble), les discussion s&#8217;enchaînent et il est déjà 18h, l&#8217;heure de partir.</p>
<p>Quelques minutes plus tard, nous arrivons au Gotha, bar du 1er arrondissement de Lyon ou déroulera la soirée.</p>
<h4>Accueil</h4>
<p>Le bar n&#8217;est pas dur à repérer, une vingtaine de personnes sont déjà devant à discuter. Avec kewix, on récupère notre badge, le livret de contact et le tee-shirt avant de ressortir discuter avec les personnes présentes. Beaucoup de premières rencontres et notamment <a  href="http://twitter.com/ubermuda">ubermuda</a>, natif de la région nantaise et qui était au lycée avec mes frangins. Que le monde est petit ^^</p>
<h4>Speed Meeting Pro</h4>
<p>Il est déjà 19h et la soirée commence par 2 sessions de 30 min de <strong>speed meeting pro</strong>. Malgré la durée un peu courte, de très bonnes rencontres lors de ces sessions avec notamment <a  href="http://twitter.com/mosamich">mosamich</a> créateur de <a  href="http://www.mosalingua.com/">MosaLingua</a> et <a  href="http://twitter.com/Schoolhead">Schoolhead</a>, étudiant un peu geek sur les bords :)</p>
<p>Le speed meeting pro terminé et en attendant la suite, petite virée au bar pour prendre une mousse, avec entre autre mosamich et David de <a  href="http://reportagesphotos.fr/">Reportages Photos</a>.</p>
<h4>Cocktail dînatoire</h4>
<p>Nous avons le droit ensuite à un petit cocktail dînatoire avec quelques mots des sponsors. C&#8217;est l&#8217;occasion de faire de nouvelles rencontres et notamment une très sympa avec <a  href="http://twitter.com/myeshopfr">Sylvain</a> de <a  href="http://www.myeshop.fr">My EShop</a> avec qui on fera une petite virée au bar d&#8217;à côté pour voir la fin de la finale du Top14 et parler e-commerce.</p>
<h4>Les cadeaux</h4>
<p>La suite de la soirée se poursuit avec un tirage au sort pour gagner quelques lots, et c&#8217;est aussi pour moi l&#8217;occasion d&#8217;enfin réussir à trouver <a  href="http://twitter.com/rkueny">rkueny</a> pour discuter un peu avec lui. La première chose que je lui ai dis il me semble, c&#8217;est que je ne gagnerais rien au tirage au sort, comme d&#8217;habitude (et visiblement comme <a  href="http://frymde.net/2010/06/02/web-event-lyon/">frymde</a> ^^). Je n&#8217;ai effectivement rien gagné mais grâce à <a  href="http://twitter.com/piouPiouM">piouPiouM</a> j&#8217;ai eu le livre <a  href="http://books.sensiolabs.com/book/plus-loin-avec-symfony-1-3-1-4">Plus loin avec Symfony 1.3 &#038; 1.4</a> qu&#8217;ubermuda aurait pu me dédicacer ;)</p>
<h4>After et after d&#8217;after !</h4>
<p>Tirage au sort fini, la fin de soirée approche, encore quelques discussions et c&#8217;est l&#8217;after qui commence avec beaucoup de monde et notamment à ma table les gars de <a  href="http://www.scopart.fr/staff/">Scopart</a>, très sympa et avec qui nous avons eu des discussion intéressantes.</p>
<p>On enchaîne avec l&#8217;after de l&#8217;after en compagnie des derniers participants mais aussi des organisateurs <a  href="http://twitter.com/ouark">Ouark</a> et <a  href="http://twitter.com/LaFermeDuWeb">Djo</a>.</p>
<p>Fin de la soirée vers &#8230; je ne vais pas vous mentir, je ne me souviens plus trop de l&#8217;heure mais il devait être près de 4h quand on est arrivé chez piouPiouM et Le Piaf Fou :)</p>
<h3>Dimanche 30 Mai 2010 et Lundi 31 Mai 2010</h3>
<p>Un dimanche tranquille chez un pote à Caluire avant de repartir le lundi matin.</p>
<p>Au revoir Lyon et surement à l&#8217;année prochaine en espérant cette fois venir avec <a  href="http://twitter.com/vjousse">Vincent</a> et <a  href="http://twitter.com/timbarray">Tim</a> ^^</p>
<p><em>P.S: désolé à ceux que j&#8217;aurais oublié, j&#8217;ai eu du mal à retenir tous les noms/pseudos.</em>EAVB_JFBPMSIYLC</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/la-ferme-du-web-web-event-2/2010/06/03/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Symfony, les forms et les forms embarqués</title>
		<link>http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/</link>
		<comments>http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 10:00:00 +0000</pubDate>
		<dc:creator><![CDATA[Vince]]></dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[conception]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=896</guid>
		<description><![CDATA[Tout d&#8217;abord admirez, dans le titre, cette traduction d&#8217;embedded forms , qui est digne d&#8217;un Nelson (ou d&#8217;un ubermuda) en pleine forme. Maintenant que c&#8217;est fait, nous allons parler ici d&#8217;un des aspects de symfony les plus intéressant, mais aussi d&#8217;un des moins bien documenté. Pas que les forms &#8220;basiques&#8221; ne soient pas documentés, mais [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/"><img src="http://www.amicalement-web.net/wp-content/uploads/boats.jpg" alt="" title="boats" width="614" height="100" class="alignnone size-full wp-image-1368" /></a> Tout d&#8217;abord admirez, dans le titre, cette traduction d&#8217;<em>embedded forms</em> , qui est digne d&#8217;un Nelson (ou d&#8217;un ubermuda) en pleine forme. </p>
<p>Maintenant que c&#8217;est fait, nous allons parler ici d&#8217;un des aspects de symfony les plus intéressant, mais aussi d&#8217;un des moins bien documenté. Pas que les forms &#8220;basiques&#8221; ne soient pas documentés, mais dès que vous voulez faire autre chose qu&#8217;un form qui représente tel quel (ou presque) un objet de la base de données, ça se complique un peu. </p>
<p>Je vais essayer de vous faire un petit tour d&#8217;horizon de <strong>ce qu&#8217;on peut faire avec les embedded forms</strong>.<br />
<span id="more-896"></span></p>
<h3>Les forms, c&#8217;est de la POO</h3>
<p>Vous allez me dire que tout symfony est de la POO (Programmation Orientée Objet), et vous avez raison. Mais on peut utiliser symfony sans être un expert de la POO (voire sans vraiment savoir ce que c&#8217;est), en suivant Jobeet et en comprenant que executeIndex inclut le template indexSuccess.php en cas de succès. À partir de là, on est le roi du monde. </p>
<p>Enfin, du monde, moins les forms. Car les forms sont &#8211; à mon sens &#8211; la partie de symfony qui est à la fois utilisée par tous les utilisateurs de symfony, et à la fois<strong> très orientée objet </strong>(les factories sont par exemple beaucoup moins utilisées &#8230;). Du coup, ça mérite quelques explications.</p>
<h3>Tout le monde n&#8217;est pas doué en POO</h3>
<p>Certes tout le monde n&#8217;est pas doué en POO, professionnel ou pas d&#8217;ailleurs ;) À l&#8217;inverse de JAVA où les programmeurs n&#8217;ont pas vraiment le choix, la POO est récente dans PHP et certains l&#8217;ont découvert comme un cheveu sur la soupe. </p>
<p>L&#8217;impression que l&#8217;on a quand on essaye de changer le comportement des embed form c&#8217;est : mais <strong>où est-ce que je peux bien faire ce que j&#8217;ai envie de faire</strong>? doBind, doUpdateObject, saveEmbeddedForms, &#8230; les choix sont multiples. </p>
<p>Et pour cause, les forms utilisent énormément l&#8217;héritage, et disposent donc de moultes méthodes que l&#8217;on peut surcharger, sans que ce ne soit vraiment documenté autre part que dans l&#8217;API. Si on ne comprend pas les principes de base de la POO, les forms sont une vraie galère (déjà que quand on les comprend &#8230;). </p>
<p>Petit rappel sur la POO sur <a href="http://hdd34.developpez.com/cours/artpoo/ ">developpez.com</a> : Consultez au moins la partie sur l&#8217;héritage pour ceux qui sont largués.</p>
<h3>Principales étapes de gestion des formulaires</h3>
<p>Il faut quand même que vous ayez quelque chose à l&#8217;esprit, il y a pour moi deux principales étapes quand vous souhaitez traiter un formulaire qui vient d&#8217;être soumis :</p>
<ul>
<li><strong>1 ère étape</strong> : lier les valeurs qui sont récupérées dans la requête à l&#8217;objet Form (c&#8217;est à dire les recopier en s&#8217;assurant qu&#8217;elles sont valides et nettoyées)</li>
<li><strong>2 ème étape</strong> : Une fois les valeurs recopiés dans le $values du formulaire (qui n&#8217;est en fait qu&#8217;un tableau de valeurs nettoyées), réaliser un traitement dessus ou sur l&#8217;objet qui en découlera (nous verrons cela par la suite)</li>
</ul>
<p>
Il est toujours bon de <strong>se demander ce que l&#8217;on veut faire exactement</strong> : agir sur les valeurs qui seront recopiées et validées dans notre form, ou alors agir sur les valeurs nettoyées et recopiées, avant qu&#8217;elles ne soient sauvegardées en base.
</p>
<h4>Première étape</h4>
<p>Lors de la première étape de liaison/validation/recopie des valeurs de la requête dans votre formulaire (votre objet Form), vous pourrez agir sur les données<strong> avant qu&#8217;elles ne soient passées dans les validateurs</strong>, ou alors une fois qu&#8217;elles sont passées dans les validateurs.</p>
<p>Vous pourrez faire votre bourrin : enlever des parties de votre formulaire de la requête en vous basant sur certaines valeurs soumises.<br />
Par exemple enlever tout un formulaire embarqué, si certaines valeurs ne sont pas saisies (c&#8217;est l&#8217;exemple qu&#8217;on trouve pas mal sur le web d&#8217;ailleurs).<br />
Petit souci : les valeurs de la requête n&#8217;auront pas été validées/nettoyées par les validateurs, vous vous exposez donc à quelques soucis (dans le style le gars qui n&#8217;aura rempli que des espaces dans un champ texte, faudra penser à faire vous même le trim avant de vérifier la valeur &#8230;).<br />
<h4>Deuxième étape</h4>
<p>
Lors de la deuxième étape, c&#8217;est ici que vous devrez effectuer<strong> les traitements concernant votre logique métier</strong> à proprement parler. La première étape s&#8217;est occupée de vous donner accès aux valeurs dans votre formulaire (via le tableau $values), maintenant que c&#8217;est fait vous pouvez jouer avec.</p>
<p>
Vous voulez mettre à jour un objet qui dépend de celui que vous allez sauvegarder automatiquement, vous souhaitez insérer votre objet dans un nested set, etc etc &#8230; C&#8217;est dans cette étape que vous ferez ça.
</p>
<p>
Je sépare sciemment le processus en deux étapes, après vous pouvez le voir autrement. Les étapes étant chaînées, vous pouvez les mélanger et faire un peu de business logic à la fin de l&#8217;étape 1 par exemple, mais essayez de rester constant partout dans votre code, où vous ne saurez plus où aller voir quand il y a un souci.
</p>
<h3>Étude de cas</h3>
<p>On va prendre ici un cas tout simple, celui d&#8217;un formulaire auto-généré par doctrine à partir d&#8217;une table de votre modèle. </p>
<p>Appelons notre modèle PetitSuisse. On aura donc une classe nommée <code>PetitSuisseForm.class.php dans lib/form/doctrine/</code></p>
<p>On va vite fait faire le parcours d&#8217;héritage de cette classe :<br />
<strong>PetitSuisseForm => BasePetitSuisseForm => BaseFormDoctrine => sfFormDoctrine => sfFormObject => BaseForm => sfFormSymfony => sfForm (ouf)</strong>
</p>
<p>
Même si quelques unes de ces classes sont vides, on comprend que ça puisse devenir un peu dur de savoir où chercher. Alors oui <strong>l&#8217;abstraction c&#8217;est bon</strong> mangez en, mais ça engendre une complexité de lecture du code non négligeable.</p>
<p>Les classes qui sont &#8220;à vous&#8221; et donc dans lesquelles vous pourrez surcharger des méthodes sont <strong>PetitSuisseForm</strong> et <strong>BaseFormDoctrine</strong>.</p>
<p> La première vous permettra de surcharger une méthode relative au formulaire du modèle PetitSuisse, la deuxième vous permettra de surcharger de manière plus globale (chacun des forms auto-générés par doctrine héritant de BaseFormDoctrine). Je parle ici de symfony 1.3+, vous n&#8217;aurez pas toutes ces classes dans les versions précédentes.</p>
<p>On va maintenant parler <strong>des principales méthodes</strong> que vous aurez (peut être) à surcharger. Il en existe d&#8217;autres, si celles ci ne vous vont pas, lisez le code de symfony ;-)
</p>
<h3>1 ère étape (liaison)</h3>
<h4>doBind(array $values)</h4>
<p>
C&#8217;est la méthode qui va faire appel aux validateurs pour <strong>nettoyer les valeurs</strong> de la requête avant de les placer dans le tableau des valeurs. Ce sont ensuite sur ces valeurs nettoyées que nous travaillerons. Vous pouvez ici toucher aux données brut de pomme <strong>qui sortent directement du formulaire envoyé</strong>, sans traitement préalable.
</p>
<h3>2 ème étape (sauvegarde)</h3>
<h4>doSave($con = null)</h4>
<p>
C&#8217;est cette méthode qui sera appelée (par save() ) lorsque vous demandez la sauvegarde de votre formulaire. Elle se charge de mettre à jour votre objet avec les valeurs du form en appelant updateObject (qui appelera doUpdateObject que nous verrons par la suite).<br />
Si vous souhaitez <strong>changer le processus de sauvegarde</strong>, ajouter par exemple l&#8217;appel d&#8217;une vos méthodes à chaque sauvegarde du formulaire (pourquoi pas garder trace dans un fichier de toutes les sauvegardes de vos formulaires), c&#8217;est ici que vous devez le faire.
</p>
<h4>processValues($values)</h4>
<p>
C&#8217;est ici que vous pouvez<strong> toucher les valeurs qui ont été nettoyées </strong>par les validateurs, avant qu&#8217;elles ne soient passées à la méthode updateObject (que nous verrons par la suite). Je n&#8217;ai pas de traitement particulier en tête, mais l&#8217;idée est là : modifier des valeurs avant qu&#8217;elles ne soient utilisées pour mettre votre objet à jour.
</p>
<h4>doUpdateObject($values)</h4>
<p>
C&#8217;est cette méthode que vous devrez surcharger si vous voulez réaliser <strong>une opération spéciale sur votre objet avant qu&#8217;il ne soit enregistré</strong> dans la base.<br />
Par exemple, si vous voulez insérer cet objet à la fin d&#8217;un NestedSet, vous ferez ça ici. Le $values passé en paramètre est un tableau contenant les valeurs du formulaire, une fois qu&#8217;elles ont été nettoyées/vérifiées par les validateurs.
</p>
<h4>updateObjectEmbeddedForm($values)</h4>
<p>
Je pense qu&#8217;elle veut bien dire ce qu&#8217;elle veut dire. Elle va se charger d&#8217;appeler la fonction updateObject de chaque formulaire embarqué. Vous voulez agir sur le traitement des données par vos forms embarqués ? C&#8217;est par ici !
</p>
<h4>saveEmbeddedForms($con = null, $forms = null)</h4>
<p>
Allez la petite dernière pour la route : elle se charge de la sauvegarde de chacun des objets de vos forms embarqués. Fabien Potencier en donne un exemple de surcharge dans le livre <a  href="http://www.symfony-project.org/more-with-symfony/1_4/en/06-Advanced-Forms#chapter_06_sub_creating_a_custom_validator">&#8220;More with symfony&#8221;</a>
</p>
<h3>Exemple d&#8217;utilisation</h3>
<p>C&#8217;est bien beau de parler, mais un peu de concret ne fait pas de mal. </p>
<p>Vous trouverez un bon exemple pour comprendre le comportement des forms sur le blog de n1k0 dans son article <a  href="http://prendreuncafe.com/blog/post/2009/11/29/Embedding-Relations-in-Forms-with-Symfony-1.3-and-Doctrine">Embedding Relations in Forms with Symfony 1.3 and Doctrine</a>. Certes c&#8217;est en anglais, mais le code est universel ! Si vous avez des bons articles en français je suis preneur aussi. </p>
<p>Il existe maintenant la méthode embedRelation() et le plugin de Daniel Lohse <a  href="http://github.com/annismckenzie/ahDoctrineEasyEmbeddedRelationsPlugin">ahDoctrineEasyEmbeddedRelationsPlugin</a> qui font ça tout seul. Mais c&#8217;est toujours bien de comprendre ce que l&#8217;on fait ;-)</p>
<h3>Conclusion</h3>
<p>Je vous ai fait un petit tour d&#8217;horizon des principales méthodes que vous pouvez surcharger dans votre formulaire. Comme je l&#8217;ai dit plus haut, ce n&#8217;est pas une liste exhaustive, mais vous devriez avoir de quoi vous amuser. </p>
<p>J&#8217;ai juste essayé de voir tout cela d&#8217;une manière un peu plus globale et de ne pas proposer un n-ième exemple de code pour les formulaires embarqués. </p>
<p>Mais avec tout cet attirail, gardez à l&#8217;esprit que votre code d&#8217;action ne doit pas dépasser le classique <code>Bind &gt; Save</code>! Ce qui est au traitement de votre formulaire, reste dans votre formulaire! Enjoy!</p>
<p><small>Crédit photo: http://www.flickr.com/photos/fromeyetopixel/2470999873/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Symfony Live 2010 : Les coulisses</title>
		<link>http://www.amicalement-web.net/symfony-live-2010-les-coulisses/2010/02/24/</link>
		<comments>http://www.amicalement-web.net/symfony-live-2010-les-coulisses/2010/02/24/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 10:00:38 +0000</pubDate>
		<dc:creator><![CDATA[Tim]]></dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[cafe]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[paris]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1225</guid>
		<description><![CDATA[Pour les retardataires, la semaine dernière se tenait le Symfony Live 2010 à Paris, auquel, Vince et moi avons assisté pendant 2 jours. Malheureusement, ce genre d&#8217;évènement n&#8217;est pas toujours à la portée de tous. Après, vous avoir résumé à notre façon, les 2 jours, il nous semblait pertinent de vous faire un petit topo [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-live-2010-les-coulisses/2010/02/24/"><img class="alignnone size-full wp-image-1338" title="elephant-php" src="http://www.amicalement-web.net/wp-content/uploads/elephant-php.jpg" alt="" width="614" height="100" /></a> Pour les retardataires, la semaine dernière se tenait le Symfony Live 2010 à Paris, auquel, <a  href="http://twitter.com/vjousse">Vince</a> et moi <a  href="/symfony-live-2010-1ere-journee/2010/02/17/">avons assisté</a> pendant <a  href="/symfony-live-2010-2eme-journee/2010/02/19/">2 jours</a>. Malheureusement, ce genre d&#8217;évènement n&#8217;est pas toujours à la portée de tous.</p>
<p>Après, vous avoir résumé à notre façon, les 2 jours, il nous semblait pertinent de vous faire un petit topo des coulisses, histoire de vous mettre encore plus dans l&#8217;ambiance et vous donner envie (ou pas) de nous y retrouver la prochaine fois!<br />
<span id="more-1225"></span></p>
<h3>L&#8217;endroit</h3>
<p>La conférence, était à Paris, <strong>à la Cité Internationale</strong> (côté porte d&#8217;Orléans donc), facilement accessible en transport en commun &#8211; métro, tram et rer pas loin &#8211; comme la précédente session en 2009. Seule différence, la salle.</p>
<p>À l&#8217;arrivée le premier jour, vous montrez patte blanche et on vous remet votre badge, votre joli tour de cou et un petit sac de pub, stickers, tshirt et autre tournevis (sisi, un tournevis yahoo :p). Il ne reste plus qu&#8217;à pousser la porte de l&#8217;arène. Juste derrière, on retrouve les stands des livres de Sensio, des éléphants PHP en peluche et autre goodies.</p>
<p>Pour le coup, on était à l&#8217;espace Adenauer (pour ceux qui connaissent l&#8217;endroit). Donc une grande salle avec gradin entouré d&#8217;un U, avec tables, chaises et quelques prises électriques. Prises qui ont du coup chauffées énormément, et ce fut un peu <strong>la guerre pour recharger son notebook</strong> chéri &#8211; heureusement que la majorité était des macs avec des autonomies digne de ce nom, mais je m&#8217;égare.</p>
<p>Du coup, il était possible d&#8217;aller se détendre sur les côtés si une conférence ne vous emballait pas, ou si vous aviez une urgence à traiter, un billet de blog à écrire et j&#8217;en passe. C&#8217;est toujours sympa. Bon du coup, les conférences avec peu de succès étaient en direct concurrence avec le bruit environnant, mais rien de dramatique.</p>
<h3>Le ravitaillement</h3>
<p>Mais le principal, derrière l&#8217;écran de projection, le ravitaillement ! Mini croissants, pains au chocolat, truc aux raisins pas bon, jus d&#8217;orange, café, thé,<strong> le tout à volonté</strong> :p Bon forcément,<strong> le café ne fait pas long feu</strong>, donc mieux vaut ne pas arriver trop tard.<br />
C&#8217;est d&#8217;ailleurs le point qui aura marqué beaucoup de monde à voir les tweets passer sur le sujet. Moralité, les geeks boivent du café, étonnant non ?</p>
<p>A midi, branle-bas de combat: Les lunchs bags arrivent ! En général, vous pouvez aller vous détendre 10min, en laissant la première vague se battre pour les premiers, de toute façon, il y en toujours plus que pas assez :p On se demande quand même, comment Fabien faisait pour être le premier servi, mais on va dire qu&#8217;on a rien vu ;)</p>
<p>Donc le minimum syndical, pour le repas &#8211; offert donc, enfin offert, compris dans le prix dirons nous ;) -, <strong>un sandwich &#8211; au choix parmi 4 ou 5 différent tout de même -</strong>, du saumon, au jambon, en passant par les classiques poulet, fromage, accompagné d&#8217;une bouteille d&#8217;eau et d&#8217;une part de tarte.<br />
A noter, que la tarte aux poires de Mercredi m&#8217;aura beaucoup plus emballé que celle aux pommes de Mardi, mais question de goût :p</p>
<h3>Le confort</h3>
<p>En tant que geek, en temps normal, on n&#8217;est pas difficile, pourvu qu&#8217;on puisse <strong>se connecter en wifi</strong>. C&#8217;était le cas, et après une petite frayeur en arrivant Mardi, il s&#8217;est avéré qu&#8217;il a plus ou moins tenu le coup ensuite.</p>
<p>Pour s&#8217;asseoir, on avait le choix des chaises devant l&#8217;estrade ou les fauteuils des gradins, genre petit cinéma de quartier. Malheureusement, même si on trouve ça sympa au début, la mousse des sièges datant certainement, elle fini par se tasser &#8211; en y restant plus de 3h d&#8217;affilée, forcément &#8211; et donnait l&#8217;impression d&#8217;être <strong>assis sur une planche de bois</strong>.</p>
<p>Certes on venait pas pour le confort, mais rajouté à l&#8217;<strong>espace assez étriqué pour chaque fauteuil</strong>, c&#8217;était pas le luxe non plus :p<br />
Heureusement la conférence a tenu ses promesses, ce qui nous permettait de se focaliser sur autre chose &#8211; peut-être était-ce prémédité.</p>
<h3>Les orateurs</h3>
<p>On a eu le droit à une belle brochette d&#8217;orateurs, tous avec des présentations en général <strong>rondement menées</strong> et bien calés sur leur sujet. Évidemment, pas simple pour les pays latins de rivaliser avec les accents américains de John ou Dustin, mais dans l&#8217;ensemble, je pense que tous ont été compris. Alors certes certains puristes ont critiqué l&#8217;accent de <a  href="http://twitter.com/ubermuda">ubermuda</a>, c&#8217;était juste un moyen d&#8217;apporter un peu de French touch à cette conférence ;)</p>
<p>On a pu apprécier, pour beaucoup, <strong>leur capacité à captiver leur auditoire</strong>, entre les slides joke, les effets musicaux ou les petites phrases échappées entre 2 slides, c&#8217;est resté très cool et dans une bonne ambiance.</p>
<p>Pour ce qui est de l&#8217;organisation, <a  href="http://twitter/hhamon">Hugo</a> s&#8217;est occupé du passage de micro et d&#8217;écourter les sessions qui commençaient à dépasser, permettant un planning presque respecté.</p>
<p>Niveau transition, on avait 5min de break entre chaque intervention, pas de quoi aller fumer une clope, et 1 pause de 15min toutes les 2 heures. Un bon rythme, même si ca représente un gros effort de concentration, c&#8217;est toujours plus simple quand on est intéressé par le sujet.</p>
<h3>Rencontres</h3>
<p>Pas simple de ce côté, car énormément de monde et un planning assez serré, pas la possibilité de rester tard dans la soirée. En rajoutant à ça, la volonté de couvrir l&#8217;évènement sur le blog. J&#8217;ai pas été super dispo.</p>
<p>Bon on a réussi à accrocher <a  href="http://twitter.com/ubermuda">ubermuda</a>, toujours mieux que rien :p</p>
<h3>Photos</h3>
<p>Forcément, on a la chance d&#8217;avoir des photographes amateurs dans ce genre de réunion, je vous laisse jeter un oeil <a  href="http://www.flickr.com/photos/tags/sflive2010/">aux photos tagguées sflive2010 sur flickr</a>.</p>
<h3>Conclusion</h3>
<p>Finalement seul détail qui m&#8217;aura marqué, c&#8217;est surtout <strong>le manque de poubelles</strong> ! Il me semble que j&#8217;en ai aperçu 2, dans la zone de ravitaillement, pas forcément très grandes. Ce qui fait &#8211; à tort ou à raison &#8211; que le sol près des sièges a été annexé parfois par les gobelets en plastique. Bon on reste des geeks me direz vous.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-live-2010-les-coulisses/2010/02/24/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony Live 2010 : 2eme journée</title>
		<link>http://www.amicalement-web.net/symfony-live-2010-2eme-journee/2010/02/19/</link>
		<comments>http://www.amicalement-web.net/symfony-live-2010-2eme-journee/2010/02/19/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 10:00:15 +0000</pubDate>
		<dc:creator><![CDATA[Tim]]></dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1237</guid>
		<description><![CDATA[Après une première journée, un peu éprouvante &#8211; levé 5h30, couché 2h &#8211; on est reparti au front, avec dans la ligne de mire la preview de Symfony 2. Forcément, ca motive. Matinée Okapi Bon, on avoue, on a un peu zappé cette conférence, histoire de gagner un peu plus de temps de sommeil pour [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-live-2010-2eme-journee/2010/02/19"><img src="http://www.amicalement-web.net/wp-content/uploads/estrade.jpg" alt="" title="estrade" width="614" height="100" class="alignnone size-full wp-image-1312" /></a> Après <a  href="/symfony-live-2010-1ere-journee/2010/02/17/">une première journée</a>, un peu éprouvante &#8211; levé 5h30, couché 2h &#8211; on est reparti au front, avec dans la ligne de mire la preview de Symfony 2. Forcément, ca motive.<br />
<span id="more-1237"></span></p>
<h3>Matinée</h3>
<h4>Okapi</h4>
<p>Bon, on avoue, on a un peu zappé cette conférence, histoire de gagner un peu plus de temps de sommeil pour tenir sur la durée, et en profiter pour mettre au propre le billet d&#8217;hier. On a juste retenu qu&#8217;ils utilisaient le <a  href="http://components.symfony-project.org/dependency-injection/">Dependency Injection Container</a> des components symfony.</p>
<p>Mais vous pouvez <a  href="http://www.slideshare.net/lsmith77/okapi-meet-symfony-symfony-meet-okapi">retrouver les slides</a>.</p>
<h4>Optimisation PHP</h4>
<p>Un tour complet à coup d&#8217;exemple de opcode, intéressant même si au final ce sont toujours les mêmes choses qui sont redites, très génériques. Je me tends à croire qu&#8217;un jour on aura un vrai cas concret dans ce genre d&#8217;intervention.</p>
<p>Et puis surtout, quand on utilise un framework, on a plus à gagner, <strong>à bien utiliser le framework</strong> qu&#8217;à optimiser une boucle. </p>
<p>Mais on a réussi à avoir quelques tips supplémentaires pendant la séance de questions :</p>
<ul>
<li>La pré incrémentation est plus rapide que la post incrémentation</li>
<li>Toujours privilégier la boucle while à une boucle for</li>
<li>Bannir les relations parent/enfant &#8211; L&#8217;enfant pointe sur le parent et inversement. Pas bon pour la mémoire</li>
</ul>
<p><a  href="http://www.slideshare.net/xdecock/php-performance-sflive-2010">Voir les slides</a><br />
Et pour aller plus loin dans le sujet, une <a  href="http://www.slideshare.net/fabianlange/full-stack-web-application-performance-tuning-presentation">ancienne présentation de Fabian Lange</a>.</p>
<h4>Git introduction</h4>
<p>Une des premières sessions Show Time, où Scott Chacon y est allé franco pour présenter Git, à une assistance majoritairement SVN.<br />
Une petite autopromo : rapidité, travail offline (sauf pull et push) et <strong>puissance du système de branches</strong> ont suffit à mettre le doute dans la tête de beaucoup, à ce qu&#8217;on pouvait lire sur twitter après coup.</p>
<p>Il a ensuite donné le lien d&#8217;une librairie pour <a  href="http://redotheoffice.com/?p=130">contrôler git depuis PHP (glib)</a> et a su répondre à la principale question:</p>
<dl>
<dt>Un équivalent de SVN externals?</dt>
<dd>Bien sûr, git uses submodules, mais il faut les mettre à jour à la main (donc 2 commandes au lieu d&#8217;une pour mettre à jour, ça reste raisonnable)</dd>
</dl>
<p><a  href="http://www.slideshare.net/chacon/git-101-presentation">Voir les slides</a></p>
<h4>Zend Framework</h4>
<p>Est arrivé, celui qui s&#8217;est présenté comme &#8220;N&#8217;est pas l&#8217;ennemi&#8221;, le lead developer du Zend Framework.<br />
Il a rappelé combien étaient nombreuses les librairies et composants développés et combien <strong>il était facile de les inclure dans symfony</strong>. Ca m&#8217;a d&#8217;ailleurs fait penser, que je ne regarde sans doute pas assez chez eux, quand j&#8217;ai besoin d&#8217;une librairie externe.</p>
<p><a  href="http://www.slideshare.net/weierophinney/using-zend-framework-with-symfony">Voir les slides</a><br />
Et Matthew a ensuite fait un debriefing son intervention <a  href="http://weierophinney.net/matthew/archives/232-Symfony-Live-2010.html">sur son blog</a>.</p>
<h3>Aprem</h3>
<h4>Implementing Symfony CMS</h4>
<p>La première touche hispanique de la conférence, qui nous a rappelé combien <strong>symfony était vraiment international</strong>. Marcos, nous a donc expliqué pourquoi avoir choisi symfony pour développer les CMS de leur client et l&#8217;approche qu&#8217;ils ont eu pour le réaliser.</p>
<p>Pas de gros scoop, ni d&#8217;exemple super concret mais une approche intéressante et surtout, t<strong>irée d&#8217;une vrai expérience dans le domaine</strong>.</p>
<p><a  href="http://www.slideshare.net/esmiz/implementing-a-symfony-based-cms-in-a-publishing-company">Voir les slides</a></p>
<h4>Event System</h4>
<p>Deuxième intervention de Dennis sur un des mécanismes sans doute le moins utilisé dans la panoplie Symfony, les events. Après avoir repris, ce qu&#8217;on peut trouver sur Symfony-Project, il a démontré pourquoi <strong>le couplage trop fort, c&#8217;était le mal </strong>- et donc <strong>les events le bien</strong> (ou le mal aussi, voir ci-dessous).</p>
<p>Un petit sondage fait sur twitter, a montré combien les possibilités étaient larges. Mais aussi qu&#8217;on pouvait en faire tout et n&#8217;importe quoi &#8211; Merci <a  href="http://twitter.com/ubermuda">ubermuda</a> pour la démonstration :p.<br />
Ce qui nous a valu l&#8217;expression &#8220;Events, No silver bullet!&#8221; &#8211; Entendre par là, que ce n&#8217;est pas la solution à tout.</p>
<p>En résumé, <strong>un event s&#8217;utilise pour du &#8220;couplage optionnel&#8221;</strong>, sinon ça revient à avoir un couplage fort également.</p>
<p>Des questions assez peu pertinentes dans l&#8217;ensemble, comme quoi, c&#8217;était pas clair pour tout le monde les events, la conf était donc nécessaire contrairement à ce qu&#8217;on pouvait lire sur twitter.</p>
<p><a  href="http://www.slideshare.net/denderello/symfony-live-2010-using-symfony-events-to-create-clean-class-interfaces">Voir les slides</a></p>
<h4>Symfony in the cloud</h4>
<p>Kris, de la core team, avec cette présentation aura remporté le prix des meilleurs transitions et de <strong>la slide la plus Hollywoodienne</strong>, avec une démo en temps réel de la création d&#8217;un nuage &#8211; musique de circonstance pour l&#8217;occasion &#8211; où il a réussi un tour de force en rajoutant un nuage en arrière plan de son nuage!<br />
Le public était conquis.</p>
<p>Plus sérieusement, il a pris comme support son site nebul.us, pour montrer comment <strong>interconnecter Symfony avec différents environnement à base de nuage</strong>, 3 serveurs Mysql &#8211; 1 Master, 2 Slaves &#8211; n apache, S3 pour le stockage.</p>
<p>De très belles démo de code pour bénéficier <strong>des nouvelles possibilités d&#8217;extension de Doctrine 1.2</strong> &#8211; à voir dans les slides &#8211; entre autres mais aussi d&#8217;<strong>utilisation de composant Zend</strong>.</p>
<p>L&#8217;effet démo ne l&#8217;aura au final pas épargné lui aussi, une tentative de release en direct de son plugin pour gérer les couples Master/Slave et un beau fail quand il est revenu sur la page d&#8217;accueil après qu&#8217;il se soit reloggué suite à l&#8217;expiration de sa session sur symfony-project :D</p>
<p>À noter que cette présentation aurait pu ne pas avoir lieu si <a  href="http://twitter.com/vjousse">Vince</a> n&#8217;avait pas sauvé la mise, en sortant un adaptateur dvi ancienne génération pour le prêter à Kris :p</p>
<p><a  href="http://www.slideshare.net/kriswallsmith/symfony-in-the-cloud">Voir les slides</a></p>
<h4>Debug Symfony</h4>
<p>Une vrai démonstration de l&#8217;approche à avoir pour <strong>vraiment optimiser son application</strong>. Plutôt que de se demander si echo sera plus rapide avec une virgule ou un point.</p>
<p>Il encourage de<strong> logguer en base</strong>, pour y avoir accès plus facilement et ajouter des notions de filtrage aisément et insiste sur<strong> les avantages du profiling</strong>, même s&#8217;il a oublié qu&#8217;<a  href="http://www.symfony-project.org/plugins/elXHProfPlugin">un plugin Symfony était dispo</a> pour ça .</p>
<p>On a pu noter les outils utilisés pour le benchmark et les metrics, <a  href="http://tsung.erlang-projects.org/">Tsung</a> et Graphite, que je ne connaissais pas. Toujours ça de bon à prendre aussi !</p>
<p>Une présentation très complète mais rien d&#8217;inédit que vous trouverez <a  href="http://www.slideshare.net/old_sound/debugging-and-profiling-symfony-apps">dans les slides</a>.</p>
<h4>Yahoooo</h4>
<p>Comme d&#8217;habitude, Dustin, membre de la core team, et Yahoo man est venu présenter un peu le boulot de Yahoo autour de symfony. Pourquoi symfony, leurs contributions, leurs modifications.<br />
Un petit tour des sites actuels développés sur le framework, avec un slide où on a pu apercevoir Shopgenie \o/ &#8211; la version anglaise de MonsieurPrix, développée par moi même ;) ca fait toujours plaisir!</p>
<p>Il a ensuite abordé le développement d&#8217;application web plus généralement et les bonnes questions à se poser concernant les choix à faire dans le design d&#8217;une architecture. Avec en guise de conclusion, une transition toute trouvée : &#8220;<strong>Symfony 2 is the right direction</strong>&#8221; !</p>
<p>On notera au passage un petit sondage de l&#8217;assistance sur les framework js, que<strong> jQuery a remporté</strong> avec une écrasante majorité.</p>
<p><a  href="http://www.slideshare.net/dustin.whittle/building-a-platform-from-open-source-at-yahoo-3209565">Voir les slides</a></p>
<h4>Symfony 2 preview</h4>
<p>Est arrivée, la présentation que tout le monde attendait, Symfony 2 ! Il faudrait un billet dédié à lui même, et on va beaucoup en parler dans les prochaines semaines, donc je vais pas m&#8217;attarder longtemps.</p>
<p>On peut retenir, que <strong>Symfony 2 sera orienté configuration</strong> &#8211; tout est configurable &#8211; et <strong>couplage faible</strong> avec un passage sur PHP 5.3. Il ne sera plus question également de développer des choses annexes, comme le logger ou le système de cache, mais d&#8217;<strong>utiliser des librairies reconnues</strong> pour ça (dont celles du Zend Framework justement).</p>
<p>Il a bien insisté sur le fait, que Symfony 2 pourra faire exactement les mêmes choses que la version 1, mais <strong>plus simplement et surtout plus rapidement</strong>. Avec par exemple, le lazy load &#8211; on charge seulement ce dont le framework a besoin.</p>
<p>Avec une conclusion &#8220;Faster as hell! &#8220;.</p>
<p>Bon il n&#8217;aura pas échappé à l&#8217;effet démo, avec une tentative de commit de la preview release en direct, qui s&#8217;est soldée également par un échec. Le compte Wifi de la Cité Universitaire était expiré ;-) Mais vous pouvez désormais récupérer le code source de cette première version et faire joujou avec sur <a  href="http://www.symfony-reloaded.org">le site dédié à Symfony 2</a> !</p>
<p><a  href="http://www.slideshare.net/fabpot/symfony-20-revealed">Voir les slides</a></p>
<p>Il ne restait plus qu&#8217;à faire le chemin inverse, Direction Marseille. En espérant avoir l&#8217;occasion de revenir ;)</p>
<p class="alignright">
<em>Vos envoyés spéciaux pour l&#8217;évènement: Vince et Tim</em>
</p>
<p style="clear: both">
<small>Crédit photo: http://www.flickr.com/photos/xavierbriand/4368850785/in/set-72157623335239339/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-live-2010-2eme-journee/2010/02/19/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony Live 2010 : 1ere journée</title>
		<link>http://www.amicalement-web.net/symfony-live-2010-1ere-journee/2010/02/17/</link>
		<comments>http://www.amicalement-web.net/symfony-live-2010-1ere-journee/2010/02/17/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 13:16:34 +0000</pubDate>
		<dc:creator><![CDATA[Tim]]></dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1217</guid>
		<description><![CDATA[Pour ceux qui suivent un peu l&#8217;actu Symfony, vous n&#8217;êtes pas sans savoir que se tient aujourd&#8217;hui et demain, le Symfony Live, un des évènements majeur du monde Symfony. Peut-être même que vous y êtes :D Et bien ça tombe bien car Vince et moi même avons la chance d&#8217;y être également ! Se rendre [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-live-2010-1ere-journee/2010/02/17"><img src="http://www.amicalement-web.net/wp-content/uploads/cite-internationale.jpg" alt="" title="cite-internationale" width="614" height="100" class="alignnone size-full wp-image-1246" /></a> Pour ceux qui suivent un peu l&#8217;actu Symfony, vous n&#8217;êtes pas sans savoir que se tient aujourd&#8217;hui et demain, le <a  href="http://www.symfony-live.com/">Symfony Live</a>, un des évènements majeur du monde Symfony. Peut-être même que vous y êtes :D</p>
<p>Et bien ça tombe bien car Vince et moi même avons la chance d&#8217;y être également !<br />
<span id="more-1217"></span></p>
<h3>Se rendre au Symfony Live</h3>
<p>Bon ce fut tout un marathon pour moi, levé 5h30 (et ceux qui me connaissent savent que c&#8217;est déjà un exploit :D), tram puis métro pour attraper mon TGV Marseille-Paris de 6h30.<br />
Arrivé à la gare de Lyon à 9h30, on repart pour une session métro, pour enchainer sur à nouveau un peu de tram avant d&#8217;arriver devant la Cité Internationale, endroit de Paris que je ne connaissais pas !</p>
<p>C&#8217;est déjà une belle surprise, l&#8217;endroit est fort sympathique, très joli, mais très graaand. Et j&#8217;ai pas trouvé les grandes affiches que j&#8217;attendais &#8220;Symfony C&#8217;est par là&#8221;. Bon finalement je débarque sur les coups de 10h30, badge, tour de cou et petit sac de goodies pour m&#8217;accueillir et me voilà dans l&#8217;arène.</p>
<p>Heureusement, il restait quelques croissants, parce que forcément j&#8217;avais fait l&#8217;impasse sur le petit déjeuner et je vais pas vous rappeler les tarifs prohibitifs de la SNCF. Juste de quoi me réveiller un peu et commencer à mettre en route mon cerveau qui jusque là ne voulait qu&#8217;une chose, se coucher.</p>
<h3>la matinée</h3>
<h4>Internationalisation</h4>
<p>On commence la journée par la présentation de <a  href="http://rabaix.net/">Thomas Rabaix</a> concernant l&#8217;internationalisation et Symfony. </p>
<p>Quelques rappels sur ce qu&#8217;est l&#8217;internationalisation, <strong>des astuces sympa comme comment traduire vos routes</strong>, mais aussi et surtout la présentation du plugin qu&#8217;il a réalisé pour <a  href="http://www.menugourmet.com/">Menu Gourmet</a> : <a  href="http://www.symfony-project.org/plugins/mgI18nPlugin">mgI18nPlugin</a>. Il permet de <strong>traduire à la volée</strong> toutes les chaînes statiques de votre page en utilisant une petit interface qui se place au dessus du site, à essayer d&#8217;urgence !<br />
Bref très bonne première présentation.</p>
<p>Vous pourrez trouver les slides de sa présentation <a  href="http://rabaix.net/en/articles/2010/02/16/symfony-live-2010-internationalization">sur son site</a>.</p>
<h4>Admin generator en détail</h4>
<p>John Cleveley nous a fait une petite piqure de rappel des nouveautés de l&#8217;admin generator depuis la version 1.0. Il a aussi été l&#8217;auteur du slide le plus classe de la journée concernant l&#8217;administration &#8220;backend&#8221; : un éléphant se soulageant le derrière dans un seau &#8230; ;-)</p>
<p>Il a rappelé que l&#8217;admin generator c&#8217;était bien, mais pas forcément pour tout. <strong>Qu&#8217;il fallait réfléchir au besoin avant de l&#8217;utiliser</strong>, plutôt que de partir avec tête baissée et se rendre compte plus tard qu&#8217;on passe plus de temps à galérer avec par rapport à ce qu&#8217;on veut faire qu&#8217;autre chose (sa remarque est d&#8217;ailleurs valable pour tout développement : c&#8217;est généralement une bonne idée de réfléchir avant de se lancer ! ).</p>
<p>Si vous voulez créer votre propre thème, vous pouvez vous inspirer de <a  href="http://www.symfony-project.org/plugins/sfAdminDashPlugin">sfAdminDashPlugin</a> et de <a  href="http://www.symfony-project.org/plugins/sfAdminThemejRollerPlugin">sfAdminThemejRollerPlugin</a>.</p>
<p>Il a aussi re-précisé que sfContext::getInstance c&#8217;était le mal (même si lui l&#8217;utilisait dans ses slides) et a fini par parler de la facilité de modifier/étendre les filtres grâce au form framework. En ce qui concerne les form, il est préférable d&#8217;en <strong>créer un nouveau pour chaque form du backend</strong>, histoire de pas confondre les forms front et back. </p>
<p>Il a conseillé d&#8217;utiliser <strong>le moins possible le generator pour les label, help etc des forms</strong>, mais de tout laisser dans le form : beaucoup plus facile à maintenir.</p>
<h4>Windows plaide coupable</h4>
<p>Surement parce qu&#8217;ils sont sponsor, on a retrouvé une équipe de Microsoft qui a plaidé pendant 50 longues minutes que Microsoft c&#8217;était aussi (et presque surtout) de l&#8217;open source et que développer dessus, c&#8217;était bien. Apparemment pas assez pour donner envie de poser des questions à l&#8217;auditoire.</p>
<p>Bon, ok sur windows, tu peux développer sur Visual Studio 2010 <strong>Ultimate</strong>, what else?</p>
<p>Du coup <a  href="http://answers.polldaddy.com/poll/2712522/">un petit sondage</a> a été lancé sur la répartition des OS pour les devs symfony</p>
<h3>L&#8217;aprèm</h3>
<h4>Symfony Internals</h4>
<p>Pas de nouveautés pour tous les développeurs qui ont pu travailler un peu en profondeur sur ce framework. <strong>Une belle revue de tout le fonctionnement interne </strong>de Symfony par Geoffrey Bachelet, et avec un accent so french ;)</p>
<p><a  href="http://www.slideshare.net/ubermuda/symfony-internals">Voir les slides</a></p>
<h4>Doctrine migration</h4>
<p>Un bon rappel sur l&#8217;enjeu des migrations et que maintenant (depuis sf 1.3) <strong>cela consiste en 3 opérations</strong> :</p>
<ul>
<li>Modifier son schema.yml pour inclure nos modifications</li>
<li>Lancer la task de diff:<br /> <code>symfony doctrine:generate-migrations-diff</code></li>
<li>Regénérer ces classes model/form/filter et lancer la migration:<br /> <code>symfony doctrine:build --all-classes --and-migrate</code></li>
</ul>
<p>Alors pourquoi s&#8217;en priver?</p>
<p><a  href="http://www.slideshare.net/denderello/symfony-live-2010-using-doctrine-migrations">Voir les slides</a></p>
<h4>Doctrine 2</h4>
<p>Est arrivé le tour de chauffe des gros sujets de la conférence. En l&#8217;occurrence Doctrine 2. Les grandes idées que Jonathan nous a montré:</p>
<ul>
<li><strong>100% réécrit</strong>, donc plus de compatibilité descendante</li>
<li><strong>~ 3 fois plus rapide</strong> que Doctrine 1.2</li>
<li>Principalement <strong>concentré sur la perf</strong>, et donc <strong>adieu la magie</strong> des findByMaColonne et consor. A l&#8217;image de Propel, les getteur et setteur seront générés dans la class model vu que les modèles justement n&#8217;hériteront plus d&#8217;une class de type Record, permettant ainsi d&#8217;alléger la charge mémoire</li>
<li>Intégration d&#8217;une classe qui s&#8217;occupera, à l&#8217;image du monde java, de <strong>gérer les flush et clear</strong>. Ca ne sera plus l&#8217;objet en lui même qu&#8217;il faudra &#8220;save&#8221; mais demander à cette nouvelle classe de le faire.</li>
</ul>
<p>Forcément, ca fait un peu peur, car au delà, d&#8217;une réécriture, ce sont des gros changements. Mais dans un souci de performance (aussi bien en terme de temps d&#8217;exécution que de charge mémoire), on prend le bon chemin. Même si la magie va disparaître&#8230;</p>
<p><a  href="http://www.slideshare.net/jwage/doctrine-2-not-the-same-old-php-orm">Voir les slides</a></p>
<h4>Offline admin generator</h4>
<p>Sur cette partie, on a retrouvé Thomat Parizot, de chez clever-age (vous savez ceux qui ont annoncé un plugin de gestion de media au dernier symfony live, mais qu&#8217;on attend toujours :p).<br />
On découvre <strong>un concept plutôt innovant</strong> dans le monde symfony, l&#8217;idée de permettre l&#8217;accès et <strong>le travail sur un backoffice sans connexion Internet</strong> semble une bonne idée. Il suffit de synchroniser, après coup, son travail.</p>
<p>Bon ok la démo n&#8217;a pas été parfaite &#8211; ahh l&#8217;effet démo &#8211; mais ya quand même un gros boulot derrière même si malheureusement c&#8217;est un concept très (trop?) <strong>dépendant de la technologie</strong>, vu qu&#8217;après Gears, il se base maintenant sur HTML5 et toutes ces nouvelles fonctionnalités. Donc très limité, mais à garder sous le coude.</p>
<h4>Help the community</h4>
<p>Skoop a redonner toutes les clés pour aider la communauté. Et que<strong> même les petites actions</strong>, comme les ouvertures de bug, sont très appréciées. </p>
<p><a  href="http://www.slideshare.net/skoop/the-symfony-community-how-to-get-help">Voir les slides</a></p>
<h4>Table ronde avec la core team</h4>
<p>Pas mal de questions sur les sujets classiques, hello world application, et consor. Voici un petit recap des questions que j&#8217;ai comprises et trouvées intéressantes:</p>
<dl>
<dt>Q: Compatibilité descendante avec la fin du support de la 1.0</dt>
<dd>R: Gros effort sur la facilité de passer à une version supérieure</dd>
<dt>Q: Documentation du système de form un peu en retrait?</dt>
<dd>R: Ne pas hésiter à aider!</dd>
<dt>Q: Symfony enseigné à l&#8217;école? Support de cours disponibles?</dt>
<dd>R: PHP déjà peut enseigné de base. Pas plus d&#8217;info à ce sujet mais ne pas hésiter à les contacter sur ce sujet</dd>
<dt>Q: Développement ne va pas trop vite?</dt>
<dd>R: La 1.4 aura bien 3 ans de support, ce qui est en soi, très long. Et puis le web évolue vite, donc il faut suivre</dd>
<dt>Q: Performance? Quid?</dt>
<dd>R: Le problème vient rarement du framework&#8230; :D </dd>
<dt>Q: Difficulté à faire adopter Symfony par leur client</dt>
<dd>R: C&#8217;est ensemble et en fournissant des cas d&#8217;utilisation précis de Symfony, qu&#8217;on pourra faire évoluer les mentalités</dd>
<dt>Q: Sismo? Bientôt dans les bacs?</dt>
<dd>R: Fabien n&#8217;a plus le temps pour l&#8217;instant. Projet en standby et clairement pas prioritaire. Et de toute façon Sismo ne fera jamais tout ce que fait Hudson et consor. Il n&#8217;a pas écarté la possibilité de ne jamais le release&#8230;</dd>
<dt>Q: Quid de la construction d&#8217;un vrai CMS Symfony une bonne foi pour toute?</dt>
<dd>R: Déjà 3 CMS existant très solides, avec 3 approches différentes. Il faut en débattre.</dd>
<dt>Q: Pourquoi reprendre plein de projets, comme Swift?</dt>
<dd>R: Une volonté de ne pas réinventer la roue et de récupérer et adapter les meilleurs pratiques et idées en PHP</dd>
<dt>Q: Et Propel dans tout ça?</dt>
<dd>R: Gros boulot de François, mais peut-être un peu trop tard?  Jamais dire jamais, mais pour l&#8217;instant après le gros switch vers Doctrine, difficile de faire machine arrière. Surtout que le futur de Propel avec sa 2.0 n&#8217;est pas du tout assuré pour l&#8217;instant</dd>
</dl>
<p>Et du coup, quelques annonces sont sorties:</p>
<ul>
<li><strong>phpbb4 sera codé en Symfony 2</strong>, ce qui en ferait le premier gros projet open source php entièrement en Symfony si je ne m&#8217;abuse</li>
<li>Symfony2 n&#8217;a plus de plugin mais des bundles&#8230;</li>
<li>Symfony2 n&#8217;utilisera plus que le meilleur des autres framework, comme le logger et le cache de Zend, <strong>au lieu de le recoder de leur côté</strong>.</li>
</ul>
<p>Voilà un petit compte rendu, les slides des différentes interventions sont disponible sur le <a  href="http://www.symfony-project.org/blog/2010/02/17/symfony-live-day-1">blog de Symfony</a>.</p>
<p class="alignright">
<em>Vos envoyés spéciaux pour l&#8217;évènement: Vince et Tim</em>
</p>
<p style="clear: both">
<small>crédit photo: http://www.flickr.com/photos/iph4n70m/4338366087/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-live-2010-1ere-journee/2010/02/17/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
