<?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; doctrine</title>
	<atom:link href="http://www.amicalement-web.net/tag/doctrine/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>Wed, 04 Jan 2012 14:54:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<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>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 [...]]]></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, &laquo;&nbsp;juste&nbsp;&raquo; 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 &laquo;&nbsp;contenté&nbsp;&raquo; 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 &laquo;&nbsp;lead&nbsp;&raquo; 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 &laquo;&nbsp;conventionnelle&nbsp;&raquo;, 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 &laquo;&nbsp;cool&nbsp;&raquo;. 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 &laquo;&nbsp;militante&nbsp;&raquo; (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 &laquo;&nbsp;bidouille&nbsp;&raquo; 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 &laquo;&nbsp;banaliser&nbsp;&raquo; 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 &laquo;&nbsp;unconférence&nbsp;&raquo;, 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>Doctrine2 : au revoir ActiveRecord, bonjour DataMapper !</title>
		<link>http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/</link>
		<comments>http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 08:55:29 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[datamapper]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1413</guid>
		<description><![CDATA[Aujourd&#8217;hui nous allons parler d&#8217;un ORM pour PHP que vous connaissez sûrement : Doctrine (si vous ne le connaissez pas je ne peux rien pour vous, ou alors juste vous donner l&#8217;adresse du site). Cela fait maintenant quelques années que Doctrine 1 a vu le jour et a été utilisé dans nombre de projets symfony, [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/"><img src="http://www.amicalement-web.net/wp-content/uploads/doctrine1.png" alt="" title="doctrine" width="614" height="100" class="alignnone size-full wp-image-1655" /></a><br />
Aujourd&#8217;hui nous allons parler d&#8217;un <a  href="http://fr.wikipedia.org/wiki/Mapping_objet-relationnel">ORM</a> pour PHP que vous connaissez sûrement : Doctrine (si vous ne le connaissez pas je ne peux rien pour vous, ou alors juste vous donner <a  href="http://www.doctrine-project.org">l&#8217;adresse du site</a>). Cela fait maintenant quelques années que Doctrine 1 a vu le jour et a été utilisé dans nombre de projets symfony, mais il est temps pour lui de prendre sa retraite, et par l&#8217;occasion de dire au revoir (ou presque) au design pattern <a  href="http://www.martinfowler.com/eaaCatalog/activeRecord.html">Active Record</a> qui va avec. D&#8217;ailleurs ça tombe bien, Doctrine 2 vient de sortir sa première version stable !<br />
<span id="more-1413"></span></p>
<h3>Modèle et persistance</h3>
<p>La première chose que l&#8217;on m&#8217;a apprise lorsqu&#8217;on m&#8217;a parlé de MVC, c&#8217;était que le M (pour model) devait contenir la <strong>logique &laquo;&nbsp;métier&nbsp;&raquo;</strong> de notre application. Quand on parle de métier, c&#8217;est bien ce qui est spécifique à l&#8217;application développée. La partie Modèle d&#8217;une calculatrice doit savoir calculer (Lapalisse si tu m&#8217;entends, elle est pour toi celle là), la partie Modèle d&#8217;une gestion de facturation doit savoir gérer les relances, les impayés, les factures &#8230; Bon bah très bien tout ça.</p>
<p>Et là c&#8217;est le drame, vous vous mettez à utiliser symfony et un des deux principaux ORM du monde PHP : <strong>Propel ou Doctrine</strong>. Tout d&#8217;abord vous trouvez ça chouette, vous pouvez faire un <strong>->save() ou un ->delete()</strong> directement sur votre objet, la classe. Mais qu&#8217;est-ce que ça veut dire ça ? Ca veut dire que votre objet connait la façon dont il doit persister. Il est fortement couplé à la façon dont vous voulez l&#8217;enregistrer, dans notre cas dans une base de données.</p>
<p>C&#8217;est assez facile à voir, regardez le graphe d&#8217;héritage de votre objet, pour Doctrine tous les objets de votre modèle héritent de la classe <code>Doctrine_Record</code>. Et si, par le plus grand des hasards, vous voulez réutiliser votre logique métier dans une autre application PHP qui n&#8217;a rien à voir avec celle que vous développez avec symfony/Doctrine ? Vous êtes bons pour de jolis copier/coller.</p>
<h3>DataMapper à la rescousse</h3>
<p>L&#8217;idéal pour réaliser des M qui ne font que du M, c&#8217;est de n&#8217;avoir que des <strong>PPO (Plain PHP Object)</strong>, c&#8217;est à dire des objets PHP standards (qui n&#8217;héritent pas d&#8217;une classe comme <code>Doctrine_Record</code> par exemple). Ces PPO doivent réaliser la logique métier de notre application (le M), et une autre partie de l&#8217;application doit pouvoir prendre ce PPO et le faire persister quelque part (système de fichier, base de données, &#8230;). C&#8217;est là qu&#8217;intervient le design pattern <a  href="http://martinfowler.com/eaaCatalog/dataMapper.html"><strong>DataMapper</strong></a>. Il va permettre de faire le lien entre l&#8217;objet (l&#8217;Entity dans le jargon Doctrine2) et la façon dont il devra persister. Dans Doctrine2, c&#8217;est l&#8217;<a  href="http://www.doctrine-project.org/api/orm/2.0/doctrine/orm/entitymanager.html">Entity Manager</a> qui va réaliser le rôle de DataMapper avec sa méthode flush() qui sauvegarde les changements dans la base de données.</p>
<h3>Unit of Work, le copain du DataMapper</h3>
<p>La méthode ->flush() de l&#8217;EntityManager va permettre d&#8217;enregistrer les changements effectués sur les PPO dans la base de données. Ces changements auront été notifiés au préalable à l&#8217;Entity Manager par la méthode persist(). Cette méthode permet de dire à l&#8217;Entity Manager que l&#8217;on veut faire persister notre PPO passé en paramètre de la méthode. Ça se résume comme ç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: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #339933;">;</span>
<span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Mr.Right'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">persist</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ici on informe l&#8217;Entity Manager (em), que l&#8217;on voudra faire persister les changements apportés à l&#8217;objet user via la méthode <code>$em->persist($user)</code>. Les changements ne seront effectués dans la base de données qu&#8217;une fois la méthode ->flush() invoquée. Si nous avions fait plusieurs ->persist() différents avant de faire notre ->flush(), rien n&#8217;aurait encore été écrit dans la base. Mais alors, comment Doctrine fait pour garder trace de ces changements jusqu&#8217;au flush ? Il utilise le design pattern <a  href="http://martinfowler.com/eaaCatalog/unitOfWork.html"><strong>Unit of Work</strong></a>. Ce design pattern permet de garder trace de toutes les modifications apportées entre 2 flush(). Il met en place une sorte de <strong>transaction, mais au niveau des objets</strong>. C&#8217;est en partie son utilisation qui permet d&#8217;avoir un beau Data Mapper comme l&#8217;EM.</p>
<h3>Conclusion</h3>
<p>L&#8217;utilisation d&#8217;un DataMapper n&#8217;est pas vraiment nouveau dans le monde de la programmation : <a  href="http://www.hibernate.org/">Hibernate</a> l&#8217;implémente déjà pour Java et <a  href="http://www.sqlalchemy.org/">SQLAlchemy</a> pour Python. En revanche, c&#8217;est une <strong>petite révolution dans le monde PHP</strong>. Si des fois vous préférez garder votre bon vieux <strong>Active Record</strong>, il existe aussi des solution en PHP : vous pouvez utiliser l&#8217;<a  href="http://www.propelorm.org/">ORM Propel</a> qui est toujours activement maintenu par François Zaninotto ou utiliser des implémentations du pattern Active Record réalisées avec Doctrine2 comme <a  href="https://github.com/pablodip/doctrator">Doctractor</a> ou <a  href="http://www.doctrine-project.org/blog/your-own-orm-doctrine2">ActiveEntity</a> codé par l&#8217;équipe de Doctrine2. C&#8217;est deux derniers exemples montrent bien toute la flexibilité et la puissance de cette nouvelle version de Doctrine !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/feed/</wfw:commentRss>
		<slash:comments>3</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>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 [...]]]></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 &laquo;&nbsp;Symfony C&#8217;est par là&nbsp;&raquo;. 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 &laquo;&nbsp;backend&nbsp;&raquo; : 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 &laquo;&nbsp;save&nbsp;&raquo; 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>
		<item>
		<title>Développement Web: les bons plans de la semaine #25</title>
		<link>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-25/2009/11/30/</link>
		<comments>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-25/2009/11/30/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 10:00:54 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Bons plans]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[icon]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=973</guid>
		<description><![CDATA[Nous revoilà parti pour une nouvelle semaine qui s&#8217;annonce déjà chargée. Mais les bons plans sont à l&#8217;heure cette semaine ;) Créer des panorama 360 en jQuery (via clementj) Un plugin qui va vite trouver ses utilisateurs, je pense. Le rendu est plutôt bon. Publiez vos stats Analytics Oui vous pouvez avoir envie de le [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.amicalement-web.net/wp-content/uploads/legume.png" alt="legume" title="legume" width="614" height="100" class="alignnone size-full wp-image-975" /> Nous revoilà parti pour une nouvelle semaine qui s&#8217;annonce déjà chargée. Mais les bons plans sont à l&#8217;heure cette semaine ;)<br />
<span id="more-973"></span></p>
<ul>
<li><a  href="http://jquery.vostrel.cz/reel">Créer des panorama 360 en jQuery</a> (via <a  href="http://twitter.com/clementj">clementj</a>)<br />
Un plugin qui va vite trouver ses utilisateurs, je pense. Le rendu est plutôt bon.</li>
<li><a  href="http://www.seethestats.com/">Publiez vos stats Analytics</a><br />
Oui vous pouvez avoir envie de le faire, pourquoi pas. Ce site, grâce à la récente api de google, permet de rendre publique une partie de ses stats à ses visiteurs ou autres</li>
<li><a  href="http://www.killerstartups.com/">Testeur de startup</a><br />
Apparemment le site est ancien, mais je ne connaissais pas! Une équipe qui s&#8217;occupe de faire des revues de startups pour dénicher les futurs twitter et consort</li>
<li><a  href="http://code.google.com/p/mysql-workbench-doctrine-plugin/wiki/HowToAddDoctrineBehavioursToTheWorkbenchModel">Doctrine behavior sur mysql workbench</a><br />
Quand il s&#8217;agit de faire des MCD, Mysql Workbench est plutôt cool! Et voilà que maintenant, on peut directement lui ajouter les behavior doctrine. Que demande le peuple!</li>
<li><a  href="http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301">Dernière faille PHP</a><br />
Si vous suivez l&#8217;actu PHP, vous savez sans doute que les versions antérieures à la version 5.3.1 ont une faille. Voici un petit récap des modifications à faire sur ces versions, si vous ne pouvez pas mettre à jour vos version</li>
<li><a  href="http://teddy.fr/blog/how-serve-big-files-through-php">Servir de gros fichiers en PHP</a><br />
Un petit snippet qui permet d&#8217;optimiser la lecteur de gros fichiers par PHP</li>
<li><a  href="http://designbump.com/originals/41-free-insanely-high-quality-icon-sets-every-designer-should-own">Des icones!</a><br />
Quelques sets que je n&#8217;avais jamais vu passer, donc je fais tourner<./li></p>
<li><a  href="http://www.flairbuilder.com/8-things-programmers-should-know-about-ui-design/">8 règles de base dans un design</a><br />
Toujours dans la rubrique, je suis un dev et je veux faire mon site sans un graphiste, voici un très bon récap sur les choses à garder en tête avant de vouloir mettre plein de bling bling et autre effet jquery à son site</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-25/2009/11/30/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony: Une utilisation du type array de Doctrine</title>
		<link>http://www.amicalement-web.net/symfony-une-utilisation-du-type-array-de-doctrine/2009/11/04/</link>
		<comments>http://www.amicalement-web.net/symfony-une-utilisation-du-type-array-de-doctrine/2009/11/04/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 10:00:47 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=925</guid>
		<description><![CDATA[Oui, les billets Symfony commençaient à me manquer. Mais difficile de trouver et le temps et la ressource pour en faire. Mais voici une petite astuce illustrée qui permet de trouver une application au type array de Doctrine tout en simplifiant une problématique. Tout ce que j&#8217;aime. Commençons par rendre à César ce qui est [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.amicalement-web.net/wp-content/uploads/check.png" alt="check" title="check" width="614" height="100" class="alignnone size-full wp-image-927" /> Oui, les billets Symfony commençaient à me manquer. Mais difficile de trouver et le temps et la ressource pour en faire. Mais voici une petite astuce illustrée qui permet de trouver une application au <a  href="http://www.doctrine-project.org/documentation/manual/1_1/en/defining-models#columns:data-types:array">type array de Doctrine</a> tout en simplifiant une problématique. Tout ce que j&#8217;aime.<br />
<span id="more-925"></span><br />
Commençons par rendre à César ce qui est à César, j&#8217;avais dans l&#8217;idée d&#8217;essayer ce type mais les exemples sur la doc ou sur le net n&#8217;était pas légion. En bon fainéant que je suis, j&#8217;ai demandé un peu d&#8217;aide et c&#8217;est mon nouveau voisin de droite, <a  href="http://twitter.com/colinux">Colin</a> qui m&#8217;a soufflé un bout de code où il l&#8217;utilise.</p>
<h3>Problématique</h3>
<p>Il me fallait stocker le résultat d&#8217;une question à choix multiple sans pour autant avoir à manipuler ensuite ses résultats autrement que par simple visualisation. Du coup, je voulais éviter d&#8217;avoir à créer une table pour stocker ces réponses et une table d&#8217;association avec ma table miroir de mon formulaire.</p>
<p>C&#8217;est là où le type array intervient. Rien de compliqué en fait, il ne fait que simplifier un traitement tout bête qui consiste à stocker un tableau php en base après sérialisation. Et qui le désérialise quand on le récupère depuis un enregistrement de la base.<br />
Une chose de moins à faire en fait et c&#8217;est bien là ce qu&#8217;on recherche nous autres développeurs, en faire le moins possible ;)</p>
<h3>La solution codée</h3>
<p>Niveau code, c&#8217;est très simple. On défini notre champ dans notre <code>schema.yml</code> comme n&#8217;importe quel autre champ</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;">meschoix: { type: array(1000) }</pre></div></div>

<p>Qui donnera un champ text en mysql.</p>
<p>Ensuite, il suffit de modifier le formulaire obtenu pour transformer notre champ en liste de checkbox de manière très classique:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widgetSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'meschoix'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfWidgetFormChoice<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'choices'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'0'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Choix1'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Choix2'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'2'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Choix3'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'3'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Choix4'</span>
      <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
      <span style="color: #0000ff;">'multiple'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
      <span style="color: #0000ff;">'expanded'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Et puis c&#8217;est tout! Maintenant, lors de l&#8217;enregistrement, Doctrine va sérialiser le résultat de votre sélection et le stocker en base. Et quand vous peuplerez votre formulaire avec des données en base, il le désérialisera et donnera les bonnes valeurs à notre liste de checkbox.</p>
<p>Bien sûr, ca nous oblige à ne pas changer l&#8217;ordre des questions et les rend difficilement modifiables. Mais c&#8217;est une décision qui doit être prise en connaissance de cette limitation.</p>
<p><small>Crédit photo: http://www.flickr.com/photos/40491122@N03/3738306829/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-une-utilisation-du-type-array-de-doctrine/2009/11/04/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Développement Web: les bons plans de la semaine #19</title>
		<link>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-19/2009/10/19/</link>
		<comments>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-19/2009/10/19/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 12:00:21 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Bons plans]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=899</guid>
		<description><![CDATA[Une semaine importante qui commence, avec le lancement de la V1 de chambres a part! Mais une semaine assez pauvre qui se termine, où j&#8217;ai trouvé peu de ressources vraiment de qualité. Peut-être aussi parce que j&#8217;avais le nez dans le nouveau code/job qui m&#8217;attend pour les prochains mois? Possible mais j&#8217;en quand même de [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.amicalement-web.net/wp-content/uploads/writing.png" alt="writing" title="writing" width="614" height="100" class="alignnone size-full wp-image-903" /> Une semaine importante qui commence, avec le lancement de la V1 de chambres a part! Mais une semaine assez pauvre qui se termine, où j&#8217;ai trouvé peu de ressources vraiment de qualité.<br />
Peut-être aussi parce que j&#8217;avais le nez dans le nouveau code/job qui m&#8217;attend pour les prochains mois? Possible mais j&#8217;en quand même de quoi faire un billet je vous rassure.<br />
<span id="more-899"></span></p>
<ul>
<li><a  href="http://woorkup.com/2009/10/14/jquery-lessons-how-to-interact-with-html-forms/">jQuery pour interagir avec les form</a><br />Un bon billet pour débutant pour apprivoiser jquery dans le contexte des formulaires. Ca permet de faire rapidement certaines choses élémentaires qu&#8217;on utiliser plus tard dans des scripts plus complexes.
</li>
<li><a  href="http://code.google.com/p/php-asset-packager/">Class PHP5 pour merger et compresser vos CSS</a><br />
Simple et efficace, cela reste une bonne pratique pour réduire les appels HTTP souvent pointé du doigt dans les performances d&#8217;un site.
</li>
<li><a  href="http://www.queness.com/post/798/5-techniques-to-style-buttons-using-images-and-css">Styler vos boutons</a><br />
Encore un, mais bien fait. Et quand on est développeurs, on est content d&#8217;avoir ce genre de ressource ;)
</li>
<li><a  href="http://net.tutsplus.com/articles/web-roundups/top-20-ways-for-web-developers-to-reduce-their-carbon-footprint/">20 moyens de réduire notre empreinte carbone en tant que développeur</a><br />
Et oui, c&#8217;est pas parce qu&#8217;on est bien au chaud derrière notre machine qu&#8217;on ne peut pas faire de petits gestes pour la planète.</li>
<li><a  href="http://srobbin.com/jquery-plugins/jquery-approach/">jQuery plugin d&#8217;approche</a><br />
Pour faire réagir un lien en fonction de la proximité de la souris. L&#8217;effet est très sympa!
</li>
<li><a  href="http://code.google.com/p/mysql-workbench-doctrine-plugin/">Doctrine plugin pour schema mysql workbench</a><br />
Dans le monde de la conception de modèle de données, mysql workbench commence à s&#8217;imposer grâce à un vrai look n feel. Voici donc un plugin qui permet de passer facilement d&#8217;un schema workbench à un schéma doctrine!
</li>
<li><a  href="http://javascript.developpez.com/cours/outils-vraiment-utiles-pour-developpeurs-javascript/">Outils pour développeurs javascript</a><br />
Parce que le javascript a bien évolué, voici une liste d&#8217;outils très pratiques pour tout ce qui touche de près ou de loin à ce langage.
</li>
<li><a  href="http://kovshenin.com/archives/automated-twitter-bot-in-php-remote-control/">Un robot twitter en PHP</a><br />
Pas vraiment d&#8217;utilisation précise mais le principe est sympa.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-19/2009/10/19/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Benchmark Apache: doctrine hydrate object vs array</title>
		<link>http://www.amicalement-web.net/benchmark-apache-doctrine-hydrate-object-vs-array/2009/10/08/</link>
		<comments>http://www.amicalement-web.net/benchmark-apache-doctrine-hydrate-object-vs-array/2009/10/08/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 09:00:59 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[hydrate]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=806</guid>
		<description><![CDATA[Il faut se rendre à l&#8217;évidence, défendre une idée sans argument, c&#8217;est bien souvent très compliqué. Et quand il a fallu que j&#8217;arrive à quantifier le réel apport d&#8217;une hydratation en tableau plutôt qu&#8217;en object, c&#8217;était un peu difficile. Rappelez-vous, j&#8217;en avais parlé dans les secrets de doctrine. Je me suis donc dis que j&#8217;allais [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.amicalement-web.net/wp-content/uploads/clock.png" alt="clock" title="clock" width="614" height="100" class="alignnone size-full wp-image-829" /> Il faut se rendre à l&#8217;évidence, défendre une idée sans argument, c&#8217;est bien souvent très compliqué. Et quand il a fallu que j&#8217;arrive à quantifier le réel apport d&#8217;une hydratation en tableau plutôt qu&#8217;en object, c&#8217;était un peu difficile. Rappelez-vous, j&#8217;en avais parlé <a  href="/doctrine-quelques-petits-secrets/2009/08/26/">dans les secrets de doctrine</a>.</p>
<p>Je me suis donc dis que j&#8217;allais tout simplement le benchmarker grosso modo, afin d&#8217;avoir une idée du gain qu&#8217;on peut avoir à passer par des tableaux. Car en fait, on sait très bien que le 2e est plus rapide, mais la question, c&#8217;est de combien.<br />
<span id="more-806"></span><br />
J&#8217;ai donc pris un modèle assez classique. Un couple de Departement/Region de France.</p>
<p>Dans mon fichier Table de mes départements, je rajoute la méthode suivante pour faire ma jointure sur régions</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getAll<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;">createQuery</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftJoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d.Regions r'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Hydratation en objet</h3>
<p>Parfait, maintenant, je crée une action qui récupère seulement tous les items de ma table, soit environ <strong>100 départements</strong>, en relation avec une région chacun.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">items</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Departements'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAll</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ca reste un cas tout a fait commun. J&#8217;ai donc lancé un <code>ab</code>, un programme livré avec apache qui permet de lancer l&#8217;exécution d&#8217;une page web, n fois avec n requêtes concurrentielles.  j&#8217;ai décidé de le lancer <strong>100 fois avec 10 requêtes à la fois</strong>. Et voici le résultat:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Document Path:          <span style="color: #000000; font-weight: bold;">/</span>hydrate<span style="color: #000000; font-weight: bold;">/</span>index
Document Length:        <span style="color: #000000;">2400</span> bytes
&nbsp;
Concurrency Level:      <span style="color: #000000;">10</span>
Time taken <span style="color: #000000; font-weight: bold;">for</span> tests:  <span style="color: #000000;">16.862</span> seconds
Complete requests:      <span style="color: #000000;">100</span>
Failed requests:        <span style="color: #000000;">0</span>
Write errors:           <span style="color: #000000;">0</span>
Total transferred:      <span style="color: #000000;">269400</span> bytes
HTML transferred:       <span style="color: #000000;">240000</span> bytes
Requests per second:    <span style="color: #000000;">5.93</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #666666; font-style: italic;">#/sec] (mean)</span>
Time per request:       <span style="color: #000000;">1686.205</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>ms<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>mean<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Time per request:       <span style="color: #000000;">168.621</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>ms<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>mean, across all concurrent requests<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Transfer rate:          <span style="color: #000000;">15.60</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>Kbytes<span style="color: #000000; font-weight: bold;">/</span>sec<span style="color: #7a0874; font-weight: bold;">&#93;</span> received
&nbsp;
Connection Times <span style="color: #7a0874; font-weight: bold;">&#40;</span>ms<span style="color: #7a0874; font-weight: bold;">&#41;</span>
              min  mean<span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #000000; font-weight: bold;">/</span>-sd<span style="color: #7a0874; font-weight: bold;">&#93;</span> median   max
Connect:        <span style="color: #000000;">0</span>    <span style="color: #000000;">0</span>   <span style="color: #000000;">0.5</span>      <span style="color: #000000;">0</span>       <span style="color: #000000;">4</span>
Processing:  <span style="color: #000000;">1172</span> <span style="color: #000000;">1665</span> <span style="color: #000000;">167.3</span>   <span style="color: #000000;">1662</span>    <span style="color: #000000;">2337</span>
Waiting:     <span style="color: #000000;">1172</span> <span style="color: #000000;">1663</span> <span style="color: #000000;">166.5</span>   <span style="color: #000000;">1661</span>    <span style="color: #000000;">2337</span>
Total:       <span style="color: #000000;">1172</span> <span style="color: #000000;">1665</span> <span style="color: #000000;">167.4</span>   <span style="color: #000000;">1662</span>    <span style="color: #000000;">2338</span>
&nbsp;
Percentage of the requests served within a certain <span style="color: #000000; font-weight: bold;">time</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>ms<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  <span style="color: #000000;">50</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1662</span>
  <span style="color: #000000;">66</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1709</span>
  <span style="color: #000000;">75</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1750</span>
  <span style="color: #000000;">80</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1783</span>
  <span style="color: #000000;">90</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1860</span>
  <span style="color: #000000;">95</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1928</span>
  <span style="color: #000000;">98</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">2102</span>
  <span style="color: #000000;">99</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">2338</span>
 <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">2338</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>longest request<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<h3>Hydratation en tableau</h3>
<p>2e action, le même code, le même résultat HTML souhaité, mais on passe dans le execute le fameux paramètre. Notre résultat ne sera donc plus une Doctrine_Collection, mais un tableau associatif avec en clé, les noms des champs.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex2<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">items</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Departements'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAll</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">HYDRATE_ARRAY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Et voici le résultat</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Document Path:          <span style="color: #000000; font-weight: bold;">/</span>hydrate<span style="color: #000000; font-weight: bold;">/</span>index2
Document Length:        <span style="color: #000000;">2400</span> bytes
&nbsp;
Concurrency Level:      <span style="color: #000000;">10</span>
Time taken <span style="color: #000000; font-weight: bold;">for</span> tests:   <span style="color: #000000;">10.086</span> seconds
Complete requests:      <span style="color: #000000;">100</span>
Failed requests:        <span style="color: #000000;">0</span>
Write errors:           <span style="color: #000000;">0</span>
Total transferred:      <span style="color: #000000;">269400</span> bytes
HTML transferred:       <span style="color: #000000;">240000</span> bytes
Requests per second:    <span style="color: #000000;">9.92</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #666666; font-style: italic;">#/sec] (mean)</span>
Time per request:       <span style="color: #000000;">1008.569</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>ms<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>mean<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Time per request:       <span style="color: #000000;">100.857</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>ms<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>mean, across all concurrent requests<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Transfer rate:          <span style="color: #000000;">26.09</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>Kbytes<span style="color: #000000; font-weight: bold;">/</span>sec<span style="color: #7a0874; font-weight: bold;">&#93;</span> received
&nbsp;
Connection Times <span style="color: #7a0874; font-weight: bold;">&#40;</span>ms<span style="color: #7a0874; font-weight: bold;">&#41;</span>
              min  mean<span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #000000; font-weight: bold;">/</span>-sd<span style="color: #7a0874; font-weight: bold;">&#93;</span> median   max
Connect:        <span style="color: #000000;">0</span>    <span style="color: #000000;">1</span>   <span style="color: #000000;">1.4</span>      <span style="color: #000000;">0</span>       <span style="color: #000000;">6</span>
Processing:   <span style="color: #000000;">598</span>  <span style="color: #000000;">992</span> <span style="color: #000000;">112.9</span>   <span style="color: #000000;">1003</span>    <span style="color: #000000;">1239</span>
Waiting:      <span style="color: #000000;">598</span>  <span style="color: #000000;">991</span> <span style="color: #000000;">113.0</span>   <span style="color: #000000;">1002</span>    <span style="color: #000000;">1239</span>
Total:        <span style="color: #000000;">599</span>  <span style="color: #000000;">993</span> <span style="color: #000000;">113.0</span>   <span style="color: #000000;">1003</span>    <span style="color: #000000;">1239</span>
&nbsp;
Percentage of the requests served within a certain <span style="color: #000000; font-weight: bold;">time</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>ms<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  <span style="color: #000000;">50</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1003</span>
  <span style="color: #000000;">66</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1051</span>
  <span style="color: #000000;">75</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1081</span>
  <span style="color: #000000;">80</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1085</span>
  <span style="color: #000000;">90</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1104</span>
  <span style="color: #000000;">95</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1128</span>
  <span style="color: #000000;">98</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1149</span>
  <span style="color: #000000;">99</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1239</span>
 <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span>   <span style="color: #000000;">1239</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>longest request<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<h3>Bilan</h3>
<p>Alors évidemment, il faut prendre en compte la différence de temps de réponse qu&#8217;on peut avoir entre 2 lancement de <code>ab</code>. Mais l&#8217;objectif est surtout de montrer que le gain est non négligeable et vraiment réel.</p>
<p>On constate que le HTML reçu est bien le même. On a donc le même rendu!<br />
Et côté performance, le 1er cas nous donne une requête en <strong>1,7sec</strong> quand le 2e nous donne <strong>1s</strong> soit près de<strong> 60% de mieux</strong>.</p>
<p>Conclusion, quand on souhaite réaliser seulement de l&#8217;affichage de données, il faut hydrater en tableau! Même si dans le cas présent, on parle de 0,7sec, il faut voir que c&#8217;est un projet vierge avec rien d&#8217;autre autour. Le gain est donc bien réel et pas seulement gadget.</p>
<p><small>Crédit photo: http://www.flickr.com/photos/don3rdse/3208161023/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/benchmark-apache-doctrine-hydrate-object-vs-array/2009/10/08/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Actualité Symfony, Doctrine et Propel</title>
		<link>http://www.amicalement-web.net/actualite-symfony-doctrine-et-propel/2009/09/21/</link>
		<comments>http://www.amicalement-web.net/actualite-symfony-doctrine-et-propel/2009/09/21/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 09:00:32 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[behavior]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=659</guid>
		<description><![CDATA[Comme souvent après la rentrée, on assiste au débarquement des nouvelles versions en tout genre, comme Apple avec Snow Leopard ou Karmic Koala chez Canonical (bon ok eux c&#8217;est tous les mois d&#8217;octobre :p). Et forcément, chez les développeurs Symfony, ca frétille d&#8217;impatience car chaque jour nous rapproche de la sortie de la version 1.3 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.amicalement-web.net/wp-content/uploads/journal-cafe-netbook.png" alt="journal-cafe-netbook" title="journal-cafe-netbook" width="614" height="100" class="alignnone size-full wp-image-745" /> Comme souvent après la rentrée, on assiste au débarquement des nouvelles versions en tout genre, comme Apple avec Snow Leopard ou Karmic Koala chez Canonical (bon ok eux c&#8217;est tous les mois d&#8217;octobre :p). </p>
<p>Et forcément, chez les développeurs Symfony, ca frétille d&#8217;impatience car chaque jour nous rapproche de la sortie de la version 1.3 de notre framework PHP préféré, dernière release majeure avant le passage en 2.0 (oué pour le coup, ils sont pas encore à la mode).</p>
<p>Je me suis dis que ca valait le coup de faire un petit tour d&#8217;horizon des nouveautés attendues (au moins par moi) que se soit Symfony, Doctrine et même Propel:<br />
<span id="more-659"></span></p>
<h3>Propel</h3>
<p>On commence avec le feuilleton de l&#8217;été. Propel, mourra, mourra pas?</p>
<p>L&#8217;info a très vite circulé, et Propel a été enterré très vite après <a  href="http://groups.google.com/group/propel-development/msg/829895b081ec7873">l&#8217;annonce de son créateur Hans Lellelid</a> d&#8217;arrêter là les frais. </p>
<p>Mais dans son message,<strong> il y avait bien un appel au passage de relai</strong>, appel auquel François Zaninotto (himself, ex de la core team Symfony) et Sven Teitje ont répondu. Le premier prenant en charge l&#8217;évolution de la branche 1.x et le second le développement de la nouvelle branche 2.x.</p>
<p>D&#8217;ailleurs ils n&#8217;ont pas trainé car <strong>on parle déjà de Propel 1.4</strong>! On suivra bien sûr ça de très près.</p>
<h3>Doctrine</h3>
<p>Avec la mode 2.0, Mister Wage prépare lui aussi une version 2.0 de son ORM Doctrine. Peu d&#8217;infos encore si ce n&#8217;est qu&#8217;il sera plus beau, plus fort et surtout plus rapide! Grâce à PHP 5.3 en particulier.<br />
Mais on pourra également retrouver <strong>des messages d&#8217;erreurs localisés</strong>! Et ça c&#8217;est la classe.</p>
<p>Mais ceci reste du futur pas proche. Et on va s&#8217;intéresser plutôt à la version 1.2, celle qui accompagnera la version 1.3 de Symfony (oui j&#8217;avoue, ils auraient pu se mettre d&#8217;accord sur les numéros de version, ça aurait été plus simple).</p>
<p>Et la nouveauté majeure pour moi, c&#8217;est la<strong> possibilité d&#8217;étendre les classe de Doctrine</strong> facilement et en particulier Doctrine_Query et Doctrine_Collection. On pourra alors généraliser certains comportements et ajouter de nouvelles fonctionnalités comme des tri personnalisés dans les collections ou adapter <a  href="http://prendreuncafe.com/blog/post/Optimize-your-Doctrine-Workflow-with-Specialized-Queries">l&#8217;idée de NiKo</a> pour les query.</p>
<p>On notera également, l&#8217;ajout d&#8217;un<strong> système d&#8217;extension</strong> directement via doctrine qui sont en fait des behaviors. Vous retrouverez <a  href="http://www.doctrine-project.org/extensions">la liste sur le site lui même</a>. J&#8217;ai d&#8217;ailleurs de mon côté, une petite idée d&#8217;extension, mais on en reparlera le moment voulu ;)</p>
<h3>Symfony</h3>
<p>Gros programme pour cette dernière release (comme annoncée, la 1.4 ne sera qu&#8217;une 1.3 débarrassé des méthodes/classes dépréciées). Beaucoup de choses, mais voici un résumé de celles que j&#8217;attends vraiment:</p>
<ul>
<li>La vrai nouveauté, un<strong> Mailer de série</strong>! Basé sur Swift, très bonne librairie, cela fera toujours un plugin de moins à utiliser</li>
<li>Le système de formulaire pluggué sur le système d&#8217;évènement avec <strong>4 nouveaux évènements</strong> qui va permettre enfin de généraliser des comportements pour certains formulaires très facilement.</li>
<li>Pouvoir <strong>ne pas générer les formulaires ou filtres d&#8217;un modèle</strong> lors de sa définition dans le schema.yml (seulement doctrine). Nan parce que, c&#8217;est vrai que des fois, on en a vraiment pas besoin.</li>
<li>Petit détail enfin corrigé, les <strong>pager intègrent enfin les interfaces Countable et Iterator</strong>.</li>
<li>Autre détail, à la génération automatique d&#8217;un label d&#8217;un champ de formulaire, <strong>les _id seront supprimés</strong>! Ca permettra d&#8217;avoir quelque chose de présentable plus facilement, pcq les _id nous on les voit pas, mais les clients, ca leur saute toujours aux yeux ;)</li>
<li>Petite révolution dans les définitions de formulaire. Actuellement, il faut retirer du formulaire les champs qu&#8217;on ne souhaite pas voir s&#8217;afficher. Mais le coup classique du &laquo;&nbsp;je rajoute un champ et il apparait automatiquement alors que je voulais pas&nbsp;&raquo; ça agace. Dans la 1.3, ca sera donc l&#8217;inverse,<strong> il faudra spécifier les champs qu&#8217;on voudra afficher</strong> grâce à la nouvelle méthode useFields</li>
<li>Niveau CLI aussi beaucoup de nouveautés, dont une assez formidable, la possibilité de <strong>rejouer seulement les tests qui auront échoué</strong>! Il suffira de rajouter l&#8217;option &#8211;only-failed.</li>
<li>Pour Doctrine aussi, beaucoup de rajouts bien pratiques, comme la possibilité de regénérer/supprimer les fichiers liés à un model donné. Et même de <strong>resynchroniser tous les modèles avec le schema.yml</strong> (entendre par là qu&#8217;il supprimera ceux qui n&#8217;existe plus). Des petits gains de temps qui ne sont pas de refus, surtout dans les débuts d&#8217;un nouveau projet.</li>
<li>Et bien sûr, la plus attendue pour la fin. <a  href="http://www.symfony-project.org/blog/2009/06/10/new-in-symfony-1-3-project-creation-customization">Fabien en avait déjà parlé sur le blog</a>, la <strong>possibilité de créer un installer</strong> pour la génération de nouveau projet qui fera automatiquement toutes les tâches de personnalisation que vous faisiez avant à la main ou en maintenant votre skeleton de projet.</li>
</ul>
<p>En tout cas, ça fait envie, et ca va dans le bon sens selon moi. Pour tous les détails:</p>
<ul>
<li><a  href="http://www.slideshare.net/jwage/symfony-13-doctrine-12">Slides de Jonathan Wage  sur Symfony 1.3 et Doctrine 1.2</a></li>
<li><a  href="http://www.symfony-project.org/tutorial/1_3/en/whats-new">Page officielle des nouveautés de la v1.3</a></li>
</ul>
<p><small>Crédit photo: http://www.flickr.com/photos/mfobrien</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/actualite-symfony-doctrine-et-propel/2009/09/21/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Développement Web: les bons plans de la semaine #14</title>
		<link>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-14/2009/09/07/</link>
		<comments>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-14/2009/09/07/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 09:00:27 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Bons plans]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=720</guid>
		<description><![CDATA[Malgré une grosse semaine passée et à venir, je ne pouvais pas vous priver de la sélection des liens de la semaine! Une sélection qui pour une fois, touche un peu à tous les domaines que je me plait à aborder, on va essayer de garder cet esprit à l&#8217;avenir. Et c&#8217;est parti: Retirer les [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.amicalement-web.net/wp-content/uploads/css-javascript.png" alt="css-javascript" title="css-javascript" width="614" height="100" class="alignnone size-full wp-image-722" /> Malgré une grosse semaine passée et à venir, je ne pouvais pas vous priver de la sélection des liens de la semaine! Une sélection qui pour une fois, touche un peu à tous les domaines que je me plait à aborder, on va essayer de garder cet esprit à l&#8217;avenir.<br />
<span id="more-720"></span></p>
<p>Et c&#8217;est parti:</p>
<ul>
<li><a  href="http://papermashup.com/remove-the-dotted-border-around-links-in-firefox/">Retirer les bordures autour des liens cliqués sous Firefox.</a><br />
Il y a pas mal de temps, un ami graphiste m&#8217;avait demandé &laquo;&nbsp;C&#8217;est vraiment moche ces bordures quand on clic&nbsp;&raquo; (oui vous savez ces graphistes et le souci du détail ;)). Et je ne pensais pas (et encore aujourd&#8217;hui) qu&#8217;on pouvait les retirer. Et pourtant c&#8217;est tout simple. (Oui oui Gi, je parle de toi, souvenir :) </li>
<li><a  href="http://www.mattvarone.com/web-design/uitotop-jquery-plugin/">Plugin jquery pour revenir en haut de la page</a><br />
Il sait se faire discret et rempli parfaitement son rôle. Une fois qu&#8217;on scroll un peu dans la page, un charmant petit module vient apparaître permettant de remonter en haut de la page.</li>
<li><a  href="http://www.slideshare.net/jwage/symfony-13-doctrine-12">Slides Symfony 1.3 et Doctrine 1.2</a><br />
Pour ceux qui auraient loupé le lien! Je suis d&#8217;ailleurs ravi des nouveautés, en particulier pour doctrine, qui nous permettra enfin d&#8217;étendre Doctrine, facilement.</li>
<li><a  href="http://www.catchmyfame.com/2009/06/25/jquery-beforeafter-plugin/">Jquery Plugin Avant/Après</a><br />
Le genre de plugin qui m&#8217;emballe. Ceux dont on ne sait pas trop à quoi il pourrait servir, jusqu&#8217;à l&#8217;illumination!</li>
<li><a  href="http://www.recessframework.org/page/php-callables-is-callable-call-user-func-array-reflection">PHP 5.3, les appels dynamiques</a><br />
Et oui, c&#8217;est une des principales nouveautés de la 5.3 et ca méritait bien un petit tuto très bien ficelé comparé à ceux que j&#8217;ai pu croiser jusque là</li>
<li><a  href="http://www.ixedit.com/">Créer simplement des animations avec jquery</a> (via <a  href="http://www.dator.fr/ixedit-creer-des-animations-et-des-interactions-avec-jquery-sans-une-ligne-de-code/">dator</a>)<br />
En voilà une idée quelle est bonne. Une interface permettant de créer rapidement et simplement des animations et des interactions avec jquery. Un bel outil.</li>
<li><a  href="http://www.queness.com/post/620/create-a-stunning-sliding-door-effect-with-jquery">Effet pour légende d&#8217;image avec jQuery</a><br />
La semaine dernière, je vous présentais un petit effect &laquo;&nbsp;ouverture de porte&nbsp;&raquo;, voilà son petit frère avec un effet encore plus recherché (et réussi à mon goût)</li>
<li><a  href="http://www.adminer.org/en/">Contrôler votre base de donnée avec un seul fichier PHP</a><br />
Sans être exceptionnel, il mérite de remplir parfaitement son rôle. Un seul fichier PHP à uploader (ou à poser en local) et vous pouvez alors contrôler vos bases de données. Un phpmyadmin light, mais efficace.
</li>
<li><a  href="http://tutorialzine.com/2009/09/making-our-own-twitter-timeline/">Créer un twitter like tout simplement</a><br />
Certes, le code est très basique, mais c&#8217;était surtout pour montrer qu&#8217;une bonne idée, ca reste une idée menée au bout (et je parle pour moi le premier ;p). Et que le concept de twitter se résume en ces quelques lignes.</li>
<li><a  href="http://www.cherrysave.com/web-design/simple-css-tricks-to-greatly-improve-site-typography/">Petites astuces CSS pour améliorer le rendu typographique</a><br />
C&#8217;est simple, mais ce sont les règles élémentaires à toujours garder à l&#8217;esprit à mon goût</li>
</ul>
<p>On essaye de diversifier mais je me rend compte qu&#8217;un peu de structure dans cette liste des fois, ça ferait pas de mal! Ou alors, je pourrais faire des compils best-of! Vous en pensez-quoi?</p>
<p><small>crédit photo: http://www.flickr.com/photos/lilit/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/developpement-web-les-bons-plans-de-la-semaine-14/2009/09/07/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Doctrine: quelques petits secrets</title>
		<link>http://www.amicalement-web.net/doctrine-quelques-petits-secrets/2009/08/26/</link>
		<comments>http://www.amicalement-web.net/doctrine-quelques-petits-secrets/2009/08/26/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 09:00:38 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=582</guid>
		<description><![CDATA[Oui, je commence à parler de Doctrine de plus en plus vu que je commence à l&#8217;utiliser à grande échelle au boulot. Et il y a un détail où j&#8217;ai encore du mal, c&#8217;est l&#8217;opacité de cet ORM comparé à son prédécesseur dans Symfony, Propel. On se rappelle tous (enfin je parle au passé, mais [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.amicalement-web.net/wp-content/uploads/doctrine-secret.png" alt="doctrine-secret" title="doctrine-secret" width="614" height="100" class="alignnone size-full wp-image-640" /> Oui, je <a  href="/doctrine-et-son-behavior-geographical/2009/08/05/">commence à parler de Doctrine</a> de plus en plus vu que je commence à l&#8217;utiliser à grande échelle au boulot. Et il y a un détail où j&#8217;ai encore du mal, c&#8217;est l&#8217;opacité de cet ORM comparé à son prédécesseur dans Symfony, Propel.</p>
<p>On se rappelle tous (enfin je parle au passé, mais Propel n&#8217;est pas mort hein :p) qu&#8217;on avait tout à disposition dans le BasePeer de notre modèle, les accesseurs, les modificateurs et quasi toutes les méthodes dont on pouvait avoir besoin. Avec Doctrine, la donne a changé, tant cet ORM est codé différemment.</p>
<p>On se retrouve du coup un peu perdu parfois, sans trop savoir ce qu&#8217;on peut utiliser. Et là, il faut bien sûr jeter un œil à l&#8217;<a href="http://www.doctrine-project.org/documentation/api/1_1 ">API Doctrine</a>. Mais on le sait tous, on a pas toujours le temps! Du coup, au travers de mes recherches, j&#8217;ai trouvé quelques petites méthodes que j&#8217;utilise régulièrement et dont je vais vous parler.<br />
<span id="more-582"></span></p>
<h3>Le modèle d&#8217;exemple</h3>
<p>Afin d&#8217;illustrer au mieux les différentes fonctions, je vais prendre en exemple un modèle basique, une liste de lien:</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;">MyLink:
  columns:
    name: { type: string(100), notnull: true }
    link: { type: string(255), notnull: true }
    description: { type: string(4000) }</pre></div></div>

<h3>Un save qui retourne un booléen</h3>
<p>Parfois, lors de petites modifications, on a pas toujours le courage de faire un try/catch sur notre transaction. TrySave répond à cette problématique, en incluant directement le try catch sur le save et en retournant un booléen, true si l&#8217;enregistrement a bien été commité, false si une exception a été levée. Bien pratique!</p>
<ul>
<li> <a  href="http://www.doctrine-project.org/Doctrine_Record/1_1#method_trysave">Documentation trySave</a></li>
<li> Exemple:

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> saveMyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$link</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Amicalement-web'</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://www.amicalement-web.net'</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">trySave</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Retournera true si la sauvegarde a été effectuée, false sinon</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</li>
</ul>
<h3>Le nom de la clé primaire</h3>
<p>Oui des fois, quand on veut généraliser une méthode, on a besoin du nom de la clé primaire de notre model. (Dans le cas d&#8217;un unset en vue d&#8217;un embedForm par exemple).</p>
<ul>
<li><a  href="http://www.doctrine-project.org/Doctrine_Table/1_1#method_getidentifier">Documentation getIdentifier</a></li>
<li> Exemple:

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$link</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getIdentifier</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</li>
</ul>
<h3>Exporter votre modèle en différents formats</h3>
<p>Que se soit pour générer des XML destinés à une application tiers, ou du json pour votre module javascript, on a souvent besoin de nos modèles dans un format d&#8217;échange. Et bien Doctrine intègre cette fonctionnalité de base, en permettant des export en tableau php, xml, yml et json.</p>
<ul>
<li><a  href="http://www.doctrine-project.org/Doctrine_Record/1_1#method_exportto">Documentation exportTo</a></li>
<li>Exemple

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$link</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Symfony Project'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://www.symfony-project.org'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">exportTo</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Attention par défaut exporte aussi les relations de l'objets. Il faut mettre à false, le 2e argument si on veut conserver seulement notre objet en question</span></pre></div></div>

</li>
<li>
Rendu:</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;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Symfony Project<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://www.symfony-project.org<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

</li>
</ul>
<h3>Importer votre modèle en différents formats</h3>
<p>Et oui parce que Doctrine fait les choses biens, la réciproque existe aussi et est toute aussi utile. Vous pouvez ainsi hydrater  un objet à partir d&#8217;un xml, json, ou yml grâce à la méthode importFrom</p>
<ul>
<li><a  href="http://www.doctrine-project.org/Doctrine_Record/1_1#method_importfrom">Documentation importFrom</a></li>
<li>Exemple:

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'{&quot;id&quot;:&quot;5&quot;,&quot;name&quot;:&quot;Doctrine Project&quot;,&quot;url&quot;:&quot;http:\/\/www.doctrine-project.org&quot;,&quot;description&quot;:&quot;Orm PHP&quot;}'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">importFrom</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'json'</span><span style="color: #339933;">,</span><span style="color: #000088;">$json</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$link</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Affiche &quot;Doctrine Project&quot;</span></pre></div></div>

</li>
</ul>
<p>Pour ce qui est d&#8217;hydrater à partir d&#8217;un tableau php, il y a 2 méthodes pour ça: fromArray et hydrate. Leurs différences, c&#8217;est la façon de faire. La première utilise les modificateurs de notre modèle (permettant ainsi de passer par des modifications qu&#8217;on aurait pu apporter à ces méthodes &laquo;&nbsp;set&nbsp;&raquo;) alors que la seconde remplie directement les attributs de notre modèle.</p>
<ul>
<li><a  href="http://www.doctrine-project.org/Doctrine_Record/1_1#method_fromarray">Documentation fromArray</a></li>
<li><a  href="http://www.doctrine-project.org/Doctrine_Record/1_1#method_hydrate">Documentation hydrate</a></li>
<li>
Exemple:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// On surcharge le modificateur de la propriété $url pour rajouter 'http://' devant</span>
<span style="color: #000000; font-weight: bold;">class</span> MyLink <span style="color: #000000; font-weight: bold;">extends</span> BaseMyLink
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUrl<span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    parent<span style="color: #339933;">::</span>_set<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'http://'</span><span style="color: #339933;">.</span><span style="color: #000088;">$url</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>Puis maintenant nos 2 appels:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Amicalement Web'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'www.amicalement-web.net'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fromArray</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'link1='</span><span style="color: #339933;">.</span><span style="color: #000088;">$link1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">url</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Affiche http://www.amicalement-web.net</span>
&nbsp;
<span style="color: #000088;">$link2</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hydrate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'link2='</span><span style="color: #339933;">.</span><span style="color: #000088;">$link2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">url</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Affiche www.amicalement-web.net</span></pre></div></div>

</li>
</ul>
<h3>Post/Pre methodes</h3>
<p>Comme je l&#8217;avais utilisé dans l&#8217;exemple du behavior Geographical, Doctrine met à disposition toute une série de méthodes en post et pré traitement de nombreuses fonctionnalités comme</p>
<ul>
<li>Sérialisation</li>
<li>Désérialisation</li>
<li>Sauvegarde</li>
<li>Suppression</li>
<li>Mise à jour</li>
<li>Insertion</li>
<li>Validation</li>
<li>Hydratation</li>
</ul>
<p><a  href="http://www.doctrine-project.org/Doctrine_Record/1_2#method_postdelete">Leur documentation</a> à la suite les unes des autre.</p>
<h3>Libérer de la mémoire</h3>
<p>La performance, sans être un axe principal a mon goût, doit rester dans la tête de chacun. Pour ça, Doctrine propose une méthode pour effacer un objet ainsi que toutes ses références de la mémoire de l&#8217;ORM. A utiliser principalement dans des boucles quand on veut juste faire un traitement sur un ensemble d&#8217;objets dont on ne voudra pas se resservir ensuite.</p>
<ul>
<li><a  href="http://www.doctrine-project.org/Doctrine_Record/1_1#method_free">Documentation free</a></li>
<li>Exemple:

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Exemple tiré de la documentation doctrine</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1000</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$object</span> <span style="color: #339933;">=</span> createBigObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">free</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true pour libérer même les relations</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</li>
</ul>
<h3>Hydrater plus efficacement</h3>
<p>Et oui, on le crie pas sur tous les toits, mais on est pas obligé de récupérer des objets complets quand on fait une requête avec doctrine même si c&#8217;est le comportement par défaut.<br />
Quand on veut simplement faire de l&#8217;affichage, parfois seules les données nous intéresse et donc dans un gain de mémoire, on peut changer le mode d&#8217;hydratation:</p>
<ul>
<li>Doctrine::HYDRATE_RECORD</li>
<li>Doctrine::HYDRATE_ARRAY</li>
<li>Doctrine::HYDRATE_NONE</li>
<li>Exemple:

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$q</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MyLink'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Comportement par défaut, retourne un tableau d'objet</span>
<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$q</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">HYDRATE_RECORD</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Retourne un tableau associatif où les clés sont les noms des champs</span>
<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$q</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">HYDRATE_ARRAY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Retourne un simple tableau où les champs sont dans l'ordre qu'ils ont été appelés</span>
<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$q</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">HYDRATE_NONE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</li>
</ul>
<p>Cela reste le fruit de mes tests et études, si vous avez des remarques ou des corrections n&#8217;hésitez pas!</p>
<p>Et vous, vous avez quelque chose à partager sur les méandres de Doctrine?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/doctrine-quelques-petits-secrets/2009/08/26/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
