<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://prendreuncafe.com/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Prendre un Café - Tag - php</title>
  <link>http://prendreuncafe.com/blog/</link>
  <atom:link href="http://prendreuncafe.com/blog/feed/tag/php/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Mon, 06 Oct 2008 12:35:34 +0200</pubDate>
  <copyright>Contenus sous licence Creative Commons BY-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Partager la session utilisateur entre Flash/Flex et symfony avec AmfPHP</title>
    <link>http://prendreuncafe.com/blog/post/2008/07/25/Partager-la-session-utilisateur-entre-Flash/Flex-et-symfony-avec-AmfPHP</link>
    <guid isPermaLink="false">urn:md5:dd8eeb08fee3290129892d772067e574</guid>
    <pubDate>Fri, 25 Jul 2008 17:07:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>amfphp</category><category>flash</category><category>flex</category><category>php</category><category>symfony</category>    
    <description>    &lt;p&gt;Pour les besoins d'un projet récent, j'ai eu besoin de valider la possibilité de gérer l'authentification et l'accès à la session &lt;a href=&quot;http://www.symfony-project.com/&quot; hreflang=&quot;en&quot;&gt;symfony&lt;/a&gt; (côté serveur) depuis une interface générée par &lt;a href=&quot;http://prendreuncafe.com/blog/post/2007/08/19/Presentation-de-Flex&quot; hreflang=&quot;fr&quot;&gt;Adobe Flex&lt;/a&gt; (en Flash, donc côté client).&lt;/p&gt;


&lt;p&gt;Pour cela, j'ai utilisé la librairie &lt;a href=&quot;http://amfphp.org/&quot; hreflang=&quot;en&quot;&gt;AmfPHP&lt;/a&gt; en version &lt;a href=&quot;https://amfphp.svn.sourceforge.net/svnroot/amfphp/tags/1.9beta2/&quot;&gt;1.9beta2&lt;/a&gt;, certes pas très récente mais suffisament fonctionnelle pour satisfaire à ce besoin précis. Voyons comment ça se passe concrètement. L'avantage de la démonstration ci-dessous est qu'elle ne nécessite pas d'installer Flex puisque AmfPHP fournit un navigateur de services (browser) qui nous suffira pour valider notre concept.&lt;/p&gt;


&lt;h3&gt;Installation du plugin sfGuard&lt;/h3&gt;


&lt;p&gt;Je pars du principe que tout le monde a une installation de symfony 1.1 nanti d'une application &lt;code&gt;main&lt;/code&gt;, ainsi qu'un projet et un virtual host apache fonctionnels pointant sur &lt;code&gt;local.mademo.org&lt;/code&gt;. Si ce n'est pas le cas, &lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/03/10/Symfony-11-beta-tour-du-proprietaire-Installation&quot; hreflang=&quot;fr&quot;&gt;voila de quoi vous mettre à jour&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;On commence par installer le plugin &lt;a href=&quot;http://trac.symfony-project.com/wiki/sfGuardPlugin&quot; hreflang=&quot;en&quot;&gt;sfGuard&lt;/a&gt;, qui se chargera de la persistance des droits et permissions utilisateurs en base de données, et fournira les utilitaires d'authentification et de manipulation de la session côté serveur :&lt;/p&gt;

&lt;pre&gt;
$ ./symfony plugin:install sfGuardPlugin
$ ./symfony propel-build-all
$ ./symfony cc
&lt;/pre&gt;


&lt;p&gt;On charge quelques données de test dans notre base de données nouvellement mise à jour :&lt;/p&gt;

&lt;pre&gt;
$ mkdir data/fixtures 
$ cp plugins/sfGuardPlugin/data/fixtures.yml.sample data/fixtures/fixtures.yml
$ ./symfony propel:data-load main
&lt;/pre&gt;


&lt;p&gt;Ce jeu de données de test nous fournit par défaut un compte &lt;code&gt;admin&lt;/code&gt; (mot de passe &lt;code&gt;admin&lt;/code&gt;) qui nous servira à tester notre service d'authentification.&lt;/p&gt;


&lt;p&gt;Ensuite, il nous faut modifier notre classe &lt;code&gt;apps/main/lib/myUser.php&lt;/code&gt; gérant la session utilisateur afin qu'elle étende désormais la classe &lt;code&gt;sfGuardSecurityUser&lt;/code&gt;, fournie par le plugin sfGuard :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Fichier apps/main/lib/myUser.php&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; myUser extends sfGuardSecurityUser
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Installation et configuration d'AmfPHP&lt;/h3&gt;


&lt;p&gt;Nous allons installer la librairie AmfPHP dans le sous-répertoire &lt;code&gt;web/&lt;/code&gt; de notre projet&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/25/Partager-la-session-utilisateur-entre-Flash/#pnote-989-1&quot; id=&quot;rev-pnote-989-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;, et aménager quelque peu notre arborescence pour accueillir les services AmfPHP :&lt;/p&gt;

&lt;pre&gt;
$ cd /path/to/project
$ svn export https://amfphp.svn.sourceforge.net/svnroot/amfphp/tags/1.9beta2 web/amfphp
$ mkdir lib/amfphp-services
$ mv web/amfphp/services/amfphp lib/amfphp-services/
&lt;/pre&gt;


&lt;p&gt;Ceci fait, nous allons éditer plusieurs fichiers d'amfphp afin de l'adapter à notre environnement symfony. Tout d'abord, commençons par éditer la valeur de la variable &lt;code&gt;$servicesPath&lt;/code&gt; dans le fichier &lt;code&gt;web/amfphp/globals.php&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ...&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$servicesPath&lt;/span&gt; = &lt;a href=&quot;http://www.php.net/dirname&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;dirname&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;__FILE__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #ff0000;&quot;&gt;'/../../lib/amfphp-services/'&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Enfin, il nous faut &amp;quot;patcher&amp;quot;&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/25/Partager-la-session-utilisateur-entre-Flash/#pnote-989-2&quot; id=&quot;rev-pnote-989-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt; le fichier &lt;code&gt;web/amfphp/core/amf/app/Filters.php&lt;/code&gt;, qui initialise la session PHP sans définir le nom de la session. Ici, nous utiliserons le nom de la session symfony par défaut, &amp;quot;&lt;code&gt;symfony&lt;/code&gt;&amp;quot; (ligne 105 du fichier) :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;102&lt;/span&gt;     &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//Fix for godaddy not allowing ini_get&lt;/span&gt;
&lt;span style=&quot;color: #cc66cc;&quot;&gt;103&lt;/span&gt;     &lt;span style=&quot;color: #0000ff;&quot;&gt;$sessionName&lt;/span&gt; = &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;PHPSESSID&amp;quot;&lt;/span&gt;;
&lt;span style=&quot;color: #cc66cc;&quot;&gt;104&lt;/span&gt;   &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #cc66cc;&quot;&gt;105&lt;/span&gt;   &lt;a href=&quot;http://www.php.net/session_name&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_name&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'symfony'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #cc66cc;&quot;&gt;106&lt;/span&gt;   &lt;a href=&quot;http://www.php.net/session_start&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_start&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #cc66cc;&quot;&gt;107&lt;/span&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;$session_id&lt;/span&gt; = &lt;a href=&quot;http://www.php.net/session_id&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;session_id&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;


&lt;h3&gt;Création d'un service permettant le partage de la session utilisateur&lt;/h3&gt;


&lt;p&gt;Voila, nous pouvons maintenant créer un service de gestion de l'authentification, que nous nommerons pompeusement &lt;code&gt;UserSessionService&lt;/code&gt; et que nous enregistrerons dans le fichier &lt;code&gt;lib/amfphp-services/UserSessionService.php&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style=&quot;color: #b1b100;&quot;&gt;require_once&lt;/span&gt; &lt;a href=&quot;http://www.php.net/dirname&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;dirname&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;__FILE__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #ff0000;&quot;&gt;'/../../config/ProjectConfiguration.class.php'&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
 * This class tests the symfony session within an AmfPHP context
 *
 */&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; UserSessionService
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Symfony context
   * @var sfContext
   */&lt;/span&gt;
  protected &lt;span style=&quot;color: #0000ff;&quot;&gt;$context&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;null&lt;/span&gt;;
  
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Symfony session
   * @var sfGuardSecurityUser
   */&lt;/span&gt;
  protected &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;null&lt;/span&gt;;
  
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Public constructor
   *
   */&lt;/span&gt;
  public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; __construct&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;$configuration&lt;/span&gt; = ProjectConfiguration::&lt;span style=&quot;color: #006600;&quot;&gt;getApplicationConfiguration&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'main'&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;'dev'&lt;/span&gt;, &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;context&lt;/span&gt; = sfContext::&lt;span style=&quot;color: #006600;&quot;&gt;createInstance&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$configuration&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;user&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;context&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getUser&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
  
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Checks wheter user is authenticated or not
   *
   * @return boolean
   */&lt;/span&gt;
  public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; isAuthenticated&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getUser&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
  
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Authenticates user
   *
   * @param  string  $username
   * @param  string  $password
   * @return boolean True if user has been successfully authenticated
   */&lt;/span&gt;
  public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; login&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$username&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;$password&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
    
    &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt; = sfGuardUserPeer::&lt;span style=&quot;color: #006600;&quot;&gt;retrieveByUsername&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$username&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
    
    &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;!&lt;a href=&quot;http://www.php.net/is_null&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;is_null&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;checkPassword&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$password&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getUser&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;signIn&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
    
    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;false&lt;/span&gt;;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
  
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Signs out a user 
   *
   */&lt;/span&gt;
  public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; logout&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getUser&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;signOut&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
  
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Retrieves the current symfony context
   *
   * @return sfContext
   */&lt;/span&gt;
  protected &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; getContext&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;context&lt;/span&gt;;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
  
  &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**
   * Retrieves the current symfony user session
   *
   * @return sfGuardSecurityUser
   */&lt;/span&gt;
  protected &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; getUser&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;user&lt;/span&gt;;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Pour tester notre service, utilisons le navigateur de service proposé par AmfPHP. Pour cela, il faut lancer un navigateur sur &lt;code&gt;http://local.mademo.org/amfphp/browser/index.html&lt;/code&gt; :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/public/images/Dev/Flex/amfphpbrowsertest.png&quot;&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Dev/Flex/.amfphpbrowsertest_m.jpg&quot; alt=&quot;Naviagateur de services AmfPHP&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Naviagateur de services AmfPHP, juil 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Via cette interface, elle même réalisée en Flex, on peut tester les méthodes publiques définies dans notre service, manipuler les arguments, et constater que nous arrivons à nous authentifier et que nous accédons bien à la même session utilisateur que dans symfony : login, logout et test du statut d'authentification.&lt;/p&gt;


&lt;h3&gt;En conclusion&lt;/h3&gt;


&lt;p&gt;On pourrait aller beaucoup plus loin dans cet exemple, en proposant par exemple une classe proxy en ActionScript 3 représentant un utilisateur du système (dans notre cas, une instance de la classe &lt;code&gt;sfGuardUser&lt;/code&gt;), cette dernière reproduisant tout ou partie de ses méthodes et propriétés, et donc d'utiliser l'ORM Propel directement depuis Flash... Je vous laisse faire vos tests si le coeur vous en dit.&lt;/p&gt;


&lt;p&gt;D'autre part, même si la librairie AmfPHP semble un peu passée au niveau architecture, elle reste néanmoins très efficace pour publier des services PHP dans Flash au travers du protocole AMF. J'ai eu vent d'autres librairies comme &lt;a href=&quot;http://www.themidnightcoders.com/weborb/&quot; hreflang=&quot;en&quot;&gt;WebORB&lt;/a&gt; ou &lt;a href=&quot;http://www.osflash.org/sabreamf&quot; hreflang=&quot;en&quot;&gt;SabreAMF&lt;/a&gt;, mais je ne sais pas vraiment ce qu'elles valent... Des avis dans l'assistance ?&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/25/Partager-la-session-utilisateur-entre-Flash/#rev-pnote-989-1&quot; id=&quot;pnote-989-1&quot;&gt;1&lt;/a&gt;] Du coup, on expose certains scripts AmfPHP, mais la librairie n'est malheureusement que prévue pour fonctionner en ce sens...&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/25/Partager-la-session-utilisateur-entre-Flash/#rev-pnote-989-2&quot; id=&quot;pnote-989-2&quot;&gt;2&lt;/a&gt;] Oui, c'est terriblement crade, je ne comprend d'ailleurs pas qu'AmfPHP n'aie pas prévu ce cas de figure...&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/07/25/Partager-la-session-utilisateur-entre-Flash/Flex-et-symfony-avec-AmfPHP'&gt;Partager la session utilisateur entre Flash/Flex et symfony avec AmfPHP&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mes conventions de codage...</title>
    <link>http://prendreuncafe.com/blog/post/2008/07/23/Mes-conventions-de-codage</link>
    <guid isPermaLink="false">urn:md5:b94a814a2f724b5abe17d299a6dfc06a</guid>
    <pubDate>Wed, 23 Jul 2008 21:21:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>bestpractices</category><category>php</category>    
    <description>    &lt;p&gt;... sont celles des projets sur lesquels je me greffe. C'est en effet pour moi une forme de respect que d'appliquer les standards de codage partagés par une communauté (ou une équipe) de développeurs : ainsi, on maximise les chances de se comprendre et on minimise les coûteuses phases de communication entre geeks introvertis&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/23/#pnote-988-1&quot; id=&quot;rev-pnote-988-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; &lt;img src=&quot;/blog/themes/Puc4/smilies/tongue.gif&quot; alt=&quot;:p&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;En effet, rien de plus pénible que de reprendre le code de quelqu'un qui a pris des libertés avec des conventions établies à ce niveau, l'apothéose étant obtenue avec ce genre de code :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Ma_superClasse &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; dire_coucou &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$popol&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;a href=&quot;http://www.php.net/echo&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'coucou '&lt;/span&gt; . &lt;span style=&quot;color: #0000ff;&quot;&gt;$popol&lt;/span&gt;   . &lt;span style=&quot;color: #ff0000;&quot;&gt;' !'&lt;/span&gt; ;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
     &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; DireAuRevoir&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$Popol&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;a href=&quot;http://www.php.net/print&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Au revoir $Popol !&amp;quot;&lt;/span&gt;;
     &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Je force bien évidemment ici le trait, mais tout le monde est déjà tombé sur ce genre de code illisible, qui multiplie par 10 votre temps d'intervention sur ce dernier et divise par 1000 votre passion pour la &lt;acronym title=&quot;Tierce Maintenance Applicative&quot;&gt;TMA&lt;/acronym&gt;.&lt;/p&gt;


&lt;p&gt;Bien entendu, il peut arriver de produire du code sur un projet ne nécessitant l'utilisation d'aucune brique logicielle existante. Auquel cas vous pouvez librement appliquer vos propres standards de codage, l'important étant ici qu'ils soient cohérents et constamment appliqués. S'il peuvent être ceux d'un projet open source existant reconnu, cela augmentera la sympathie potentielle à votre égard de futurs intervenants sur votre code &lt;img src=&quot;/blog/themes/Puc4/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Je noterai quand même en vrac quelques bonnes pratiques générales globalement reconnues et appréciées :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;être explicite,&lt;/li&gt;
&lt;li&gt;indenter son code,&lt;/li&gt;
&lt;li&gt;documenter son code,&lt;/li&gt;
&lt;li&gt;à choisir entre les deux, privilégier la lisibilité à la concision,&lt;/li&gt;
&lt;li&gt;utiliser des noms de variables, de classes, de méthodes, de fonctions et d'arguments parlants,&lt;/li&gt;
&lt;li&gt;utiliser des noms anglophones,&lt;/li&gt;
&lt;li&gt;utiliser des motifs de conception connus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personnellement, j'ai mes petites préférences et tout comme &lt;a href=&quot;http://case.oncle-tom.net/&quot; hreflang=&quot;fr&quot;&gt;Oncle Tom&lt;/a&gt; - qui m'a gentiment refilé &lt;a href=&quot;http://case.oncle-tom.net/2008/07/23/conventions-de-programmation-necessaire-maturite/&quot; hreflang=&quot;fr&quot;&gt;cette chaîne&lt;/a&gt;&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/23/#pnote-988-2&quot; id=&quot;rev-pnote-988-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt; - j'ai tendance à appliquer les &lt;a href=&quot;http://trac.symfony-project.org/wiki/HowToContributeToSymfony#CodingStandards&quot; hreflang=&quot;en&quot;&gt;standards de codage de symfony&lt;/a&gt;, que je trouve homogènes et cohérents. Mais ce sont là bien évidemment essentiellement des questions de goûts et de couleurs.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/23/#rev-pnote-988-1&quot; id=&quot;pnote-988-1&quot;&gt;1&lt;/a&gt;] Voire les trolls genre &lt;em&gt;les tabulations ça pue, vive l'indentation à trois espaces&lt;/em&gt;...&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/07/23/#rev-pnote-988-2&quot; id=&quot;pnote-988-2&quot;&gt;2&lt;/a&gt;] Salopard, ça va se payer ! &lt;img src=&quot;/blog/themes/Puc4/smilies/wink.gif&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/07/23/Mes-conventions-de-codage'&gt;Mes conventions de codage...&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Debug PHP facile avec Firefox, Firebug et FirePHP</title>
    <link>http://prendreuncafe.com/blog/post/2008/07/20/Debug-PHP-facile-avec-Firefox-Firebug-et-FirePHP</link>
    <guid isPermaLink="false">urn:md5:6804fe93c7365b5133c5b195d8d00c86</guid>
    <pubDate>Sun, 20 Jul 2008 11:39:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>debug</category><category>firebug</category><category>firefox</category><category>firephp</category><category>php</category>    
    <description>    &lt;p&gt;Tous ceux qui ont déjà eux à batailler avec du code javascript connaissent certainement la fabuleuse extension &lt;a href=&quot;http://getfirebug.com/&quot; hreflang=&quot;en&quot;&gt;Firebug&lt;/a&gt; pour &lt;a href=&quot;http://getfirefox.com/&quot; hreflang=&quot;en&quot;&gt;Firefox&lt;/a&gt;. L'outil propose une console permettant d'examiner l'environnement d'exécution javascript mais aussi HTML et CSS de n'importe quelle page web.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.firephp.org/&quot; hreflang=&quot;en&quot;&gt;FirePHP&lt;/a&gt; est une autre extension qui a pour but de proposer le même service mais pour le langage &lt;a href=&quot;http://fr.php.net/&quot; hreflang=&quot;fr&quot;&gt;PHP&lt;/a&gt;. L'extension repose elle-même sur Firebug et propose, une fois installée, l'affichage dans la console des messages de debug émis depuis vos scripts PHP :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Dev/PHP/firephpdemo.png&quot; alt=&quot;Démo FirePHP&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Démo FirePHP, juil 2008&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Une fois l'&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/6149&quot; hreflang=&quot;en&quot;&gt;extension Firefox&lt;/a&gt; installée, pour pouvoir envoyer un message de log dans la console depuis vos scripts, il faut utiliser une librairie spécifique PHP fournie &lt;a href=&quot;http://www.firephp.org/DownloadRelease/FirePHPLibrary-FirePHPCore-0.1.1&quot;&gt;téléchargeable&lt;/a&gt; depuis la &lt;a href=&quot;http://www.firephp.org/&quot; hreflang=&quot;en&quot;&gt;page d'accueil&lt;/a&gt; du projet FirePHP. Cette librairie très simple est d'ailleurs &lt;a href=&quot;http://www.firephp.org/Wiki/Reference/Fb&quot; hreflang=&quot;en&quot;&gt;documentée ici&lt;/a&gt;. Une fois l'archive récupérée, décompressez-la et appelez FirePHP de cette façon depuis un script PHP standard :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;require_once&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'/path/to/firephp/lib/FirePHPCore/FirePHP.class.php'&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$f&lt;/span&gt; = FirePHP::&lt;span style=&quot;color: #006600;&quot;&gt;getInstance&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$f&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;fb&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'Hello FirePHP console'&lt;/span&gt;, FirePHP::&lt;span style=&quot;color: #006600;&quot;&gt;INFO&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$f&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;fb&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'hello'&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'how are you?'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$f&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;fb&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'hello'&lt;/span&gt; =&amp;gt; &lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'how'&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;'are'&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;'you'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$f&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;fb&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'foo'&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;'bar'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;'Results'&lt;/span&gt;, FirePHP::&lt;span style=&quot;color: #006600;&quot;&gt;WARN&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$o&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; stdClass&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$o&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;foo&lt;/span&gt; = &lt;span style=&quot;color: #ff0000;&quot;&gt;'foofoo'&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$o&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;bar&lt;/span&gt; = &lt;span style=&quot;color: #ff0000;&quot;&gt;'barbar'&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$f&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;fb&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$o&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Pour envoyer les informations de debug à la console, la librairie PHP envoie les données sérialisées au format &lt;a href=&quot;http://json.org/&quot; hreflang=&quot;en&quot;&gt;JSON&lt;/a&gt; dans un entête HTTP personnalisé dédié (&lt;em&gt;X-FirePHP-Data&lt;/em&gt;). Ainsi, aucune interférence n'est possible avec vos scripts existants, la seule condition étant bien entendu de ne pas lancer la sortie standard PHP avant que ces entêtes aient été envoyés.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Dev/PHP/firephphttp.png&quot; alt=&quot;Données JSON passées dans un entête dédié&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Données JSON passées dans un entête dédié, juil 2008&quot; /&gt;&lt;/p&gt;


&lt;p&gt;En bref, un outil génialement simple et efficace.&lt;/p&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/07/20/Debug-PHP-facile-avec-Firefox-Firebug-et-FirePHP'&gt;Debug PHP facile avec Firefox, Firebug et FirePHP&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Symfony 1.1 est dans les bacs</title>
    <link>http://prendreuncafe.com/blog/post/2008/06/30/Symfony-11-est-dans-les-bacs</link>
    <guid isPermaLink="false">urn:md5:8b1abe85309005aa05a0d5e82940b038</guid>
    <pubDate>Mon, 30 Jun 2008 01:13:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>framework</category><category>php</category><category>symfony</category>    
    <description>    &lt;p&gt;Nous venons de &lt;a href=&quot;http://www.symfony-project.org/blog/2008/06/30/the-wait-is-over-symfony-1-1-released&quot; hreflang=&quot;fr&quot;&gt;releaser symfony 1.1&lt;/a&gt;, le framework qui blanchit les dents et rafraîchit l'haleine.&lt;/p&gt;


&lt;p&gt;C'est une étape importante puisque &lt;a href=&quot;http://www.symfony-project.org/blog/2008/06/23/the-symfony-1-1-architecture&quot; hreflang=&quot;en&quot;&gt;l'architecture même du framework a été entièrement repensée&lt;/a&gt;, pour être notamment plus découplée, et favoriser ainsi l'extensibilité et la configurabilité. Voici les autres améliorations phares de cette nouvelle version :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le nouveau &lt;a href=&quot;http://www.symfony-project.org/book/forms/1_1/fr/&quot; hreflang=&quot;fr&quot;&gt;framework de formulaires&lt;/a&gt;, entièrement orienté objet, permet une réutilisation maximale des éléments et en garantit la sécurité de façon transparente,&lt;/li&gt;
&lt;li&gt;Le &lt;a href=&quot;http://www.symfony-project.org/cookbook/1_1/fr/tasks&quot; hreflang=&quot;fr&quot;&gt;système de gestion de tâches en ligne de commande&lt;/a&gt; est une grosse tuerie, il vous permet de créer des scripts en ligne de commande avec gestion de l'aide, des arguments et des options, le tout avec une sortie en couleur au besoin !&lt;/li&gt;
&lt;li&gt;Le &lt;a href=&quot;http://www.symfony-project.org/blog/2008/06/19/yaml-in-symfony-1-1&quot; hreflang=&quot;en&quot;&gt;parser YAML&lt;/a&gt; a été réécrit from scratch et propose maintenant des messages d'erreurs contextualisés, bien utile à l'heure du débogage,&lt;/li&gt;
&lt;li&gt;La &lt;a href=&quot;http://www.symfony-project.org/cookbook/1_1/en/iphone&quot; hreflang=&quot;en&quot;&gt;gestion des formats web&lt;/a&gt; permet à votre application de fournir une réponse et un format différents en fonction du type de requête entrante ; concrètement, vous gardez le même contrôleur mais vous proposez des vues adaptées dans le format qui va bien (html, xml, json, etc.) &lt;img src=&quot;/blog/themes/Puc4/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;La &lt;a href=&quot;http://www.symfony-project.org/cookbook/1_1/en/plugins&quot; hreflang=&quot;en&quot;&gt;gestion des plugins&lt;/a&gt; a été entièrement revue et propose maintenant une totalement API compatible avec le standard PEAR, et gère notamment les dépendances,&lt;/li&gt;
&lt;li&gt;La couche ORM Propel, toujours en version 1.2, est maintenant proposée sous la forme d'un plugin (activé par défaut), permettant ainsi plus facilement d'utiliser &lt;a href=&quot;http://www.symfony-project.org/blog/2008/06/16/getting-started-with-doctrine-and-symfony-1-1&quot; hreflang=&quot;en&quot;&gt;Doctrine&lt;/a&gt; ou &lt;a href=&quot;http://www.symfony-project.org/cookbook/1_1/fr/propel_13&quot; hreflang=&quot;fr&quot;&gt;Propel 1.3&lt;/a&gt; si vous préferez,&lt;/li&gt;
&lt;li&gt;Le routing a été grandement amélioré tant en performances qu'en extensibilité et souplesse de configuration,&lt;/li&gt;
&lt;li&gt;La compatibilité avec symfony 1.0 est assurée grâce au plugin sfCompat10, fourni par défaut et activable en une ligne de configuration,&lt;/li&gt;
&lt;li&gt;Enfin, plus de 8500 tests unitaires et fonctionnels garantissent la stabilité de l'API et préviennent de l'apparition de régressions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voila, l'accouchement fut un peu long mais le bébé est là, rose et bien portant. Et il n'attend plus que vous pour &lt;a href=&quot;http://www.symfony-project.org/installation/1_1&quot; hreflang=&quot;en&quot;&gt;jouer avec lui&lt;/a&gt; &lt;img src=&quot;/blog/themes/Puc4/smilies/tongue.gif&quot; alt=&quot;:p&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/06/30/Symfony-11-est-dans-les-bacs'&gt;Symfony 1.1 est dans les bacs&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Symfotaf</title>
    <link>http://prendreuncafe.com/blog/post/2008/06/25/poste-developpeur-php-symfony-paris</link>
    <guid isPermaLink="false">urn:md5:840806a9e499c9d7597828ec0a42fe01</guid>
    <pubDate>Wed, 25 Jun 2008 20:00:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Divers</category>
        <category>emploi</category><category>job</category><category>php</category><category>sensiolabs</category><category>symfony</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Rigolo/web_needs_you.jpg&quot; alt=&quot;Aidez Superdupont à conquérir le web avec symfony!&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; title=&quot;Aidez Superdupont à conquérir le web avec symfony!&quot; /&gt; &lt;a href=&quot;http://sensiolabs.com/&quot;&gt;Sensio Labs&lt;/a&gt;, la société créatrice du &lt;a href=&quot;http://www.symfony-project.com&quot; hreflang=&quot;en&quot;&gt;framework symfony&lt;/a&gt; dont je vous parle souvent ici et pour laquelle je travaille, cherche à &lt;strong&gt;recruter un ou plusieurs développeurs PHP&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;Le poste&lt;/h3&gt;


&lt;p&gt;Le profil du développeur recherché, c'est plutôt quelqu'un (ou quelqu'une, d'ailleurs) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ayant idéalement déjà mis en œuvre le &lt;a href=&quot;http://symfony-project.org/&quot; hreflang=&quot;fr&quot;&gt;framework symfony&lt;/a&gt; sans s'être fait insulter par son client à l'issu du projet,&lt;/li&gt;
&lt;li&gt;plutôt franchement à l'aise avec les fonctionnalités objets de &lt;a href=&quot;http://fr.php.net/class&quot; hreflang=&quot;fr&quot;&gt;php5&lt;/a&gt; (y compris ses nombreux exotismes qui nous rendent fous d'amour pour ce merveilleux langage&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/06/25/#pnote-981-1&quot; id=&quot;rev-pnote-981-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;),&lt;/li&gt;
&lt;li&gt;à l'aise avec les principaux standards du Web comme (X)(HT)ML et CSS,&lt;/li&gt;
&lt;li&gt;ne citant pas les travaux de Philippe Starck à l'évocation d'un design pattern,&lt;/li&gt;
&lt;li&gt;curieux, ayant envie d'apprendre et de progresser techniquement,&lt;/li&gt;
&lt;li&gt;respectueux des bonnes pratiques de développement (ou du moins comprenant l'intérêt de les mettre en oeuvre),&lt;/li&gt;
&lt;li&gt;autonome, mais prompt à aider les autres s'ils sont en difficultés,&lt;/li&gt;
&lt;li&gt;qui lit et comprend l'anglais technique (là je viens de faire fuir 24 personnes, j'assume),&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans les &lt;em&gt;nice-to-have features&lt;/em&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la connaissance d'un autre langage de programmation orienté objet est un &lt;strong&gt;gros&lt;/strong&gt; plus (l'équivalent d'un bonus 1D30 + 10, pour donner une idées aux nerds),&lt;/li&gt;
&lt;li&gt;même chose pour la connaissance de JavaScript et d'un ou plusieurs frameworks dans ce langage,&lt;/li&gt;
&lt;li&gt;si capacités en gestion de projet, on vous offre un apéritif gratuit offert par la maison,&lt;/li&gt;
&lt;li&gt;l'acceptation d'une géolocalisation professionnelle sur &lt;a href=&quot;http://maps.google.fr/maps?f=q&amp;amp;hl=fr&amp;amp;geocode=&amp;amp;q=92,+boulevard+Victor+Hugo,+Clichy+(SensioLabs)&amp;amp;sll=48.902695,2.30408&amp;amp;sspn=0.033401,0.088921&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;z=16&amp;amp;iwloc=addr&quot; hreflang=&quot;fr&quot;&gt;Clichy&lt;/a&gt; (Hauts-de-Seine) est impérative,&lt;/li&gt;
&lt;li&gt;ah, et primordial également, posséder une importante capacité de résistance aux calembours foireux est fortement recommandé (d'ailleurs, le poste d'émetteur de ces derniers est actuellement occupé).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Rigolo/fabpot.gif&quot; alt=&quot;Fabien P., notre bon patron à tous&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Bref, si vous vous reconnaissez complètement (ou fortement, voire partiellement) n'hésitez pas à me contacter, par le biais du &lt;a href=&quot;http://prendreuncafe.com/blog/contact&quot; hreflang=&quot;fr&quot;&gt;formulaire de contact du blog&lt;/a&gt; ou, si vous avez peur que je trafique votre CV parce qu'il est mieux que le mien, directement sur &lt;a href=&quot;http://sensiolabs.com/fr/contact&quot; hreflang=&quot;fr&quot;&gt;celui de SensioLabs&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Post-scriptum&lt;/h3&gt;


&lt;p&gt;Je tiens à publiquement m'excuser auprès de &lt;a href=&quot;http://fr.wikipedia.org/wiki/Gotlib&quot; hreflang=&quot;fr&quot;&gt;Dieu&lt;/a&gt;, aka &lt;a href=&quot;http://www.marcelgotlib.com/&quot; hreflang=&quot;fr&quot;&gt;Marcel Gotlib&lt;/a&gt;, pour avoir détourné l'image de quelques-uns de ses personnages à de pures fins de recrutement éhontées. Pour m'excuser je vais relire l'intégrale de la &lt;a href=&quot;http://fr.wikipedia.org/wiki/Rubrique-%C3%A0-brac&quot; hreflang=&quot;fr&quot;&gt;Rubrique à Brac&lt;/a&gt; et m'adresser en consultation au professeur Burp, tiens.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/06/25/#rev-pnote-981-1&quot; id=&quot;pnote-981-1&quot;&gt;1&lt;/a&gt;] Ou pas, détester php en sachant expliquer pourquoi est une feature &lt;img src=&quot;/blog/themes/Puc4/smilies/tongue.gif&quot; alt=&quot;:p&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/06/25/poste-developpeur-php-symfony-paris'&gt;Symfotaf&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>ESC_RAWquerie</title>
    <link>http://prendreuncafe.com/blog/post/2008/06/24/ESC_RAWquerie</link>
    <guid isPermaLink="false">urn:md5:8d1cad8142d699739985dfec903b024f</guid>
    <pubDate>Tue, 24 Jun 2008 07:28:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>escaping</category><category>php</category><category>symfony</category><category>tips</category>    
    <description>    &lt;p&gt;Le saviez-vous ? Dans &lt;a href=&quot;http://symfony-project.org&quot; hreflang=&quot;en&quot;&gt;symfony&lt;/a&gt;, il est possible de désactiver l'&lt;a href=&quot;http://www.symfony-project.org/book/1_0/07-Inside-the-View-Layer#Output%20Escaping&quot; hreflang=&quot;en&quot;&gt;échappement des contenus&lt;/a&gt; en passant la constante &lt;code&gt;ESC_RAW&lt;/code&gt; en dernier paramètre d'une fonction ou méthode de classe depuis une template :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;a href=&quot;http://www.php.net/echo&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$article&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getTitle&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;ESC_RAW&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Plutôt donc que :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;a href=&quot;http://www.php.net/echo&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$article&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getRawValue&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getTitle&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ou l'infâme :&lt;/p&gt;

&lt;pre class=&quot;php&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;a href=&quot;http://www.php.net/echo&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$sf_data&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getRaw&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'article'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getTitle&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Voila, c'est tout, c'était surtout l'occasion de faire en titre le pire jeu de mot de ce blog, et de pousser le billet d'humeur sur la RATP un peu plus bas sur la home.&lt;/p&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/06/24/ESC_RAWquerie'&gt;ESC_RAWquerie&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>No, really, symfony doesn't scale!</title>
    <link>http://prendreuncafe.com/blog/post/2008/05/08/No-really-symfony-doesnt-scale</link>
    <guid isPermaLink="false">urn:md5:9fcd83159e38778b5d7fabf58442e2a0</guid>
    <pubDate>Thu, 08 May 2008 09:36:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Divers</category>
        <category>framework</category><category>php</category><category>scale</category><category>symfony</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/05/04/QOTD&quot;&gt;Well&lt;/a&gt;, err... &lt;a href=&quot;http://www.symfony-project.org/blog/2008/05/08/yahoo-answers-powered-by-symfony&quot; hreflang=&quot;en&quot;&gt;Really&lt;/a&gt;?&lt;/p&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/05/08/No-really-symfony-doesnt-scale'&gt;No, really, symfony doesn't scale!&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Petit-déjeuner de présentation symfony le 23 avril prochain</title>
    <link>http://prendreuncafe.com/blog/post/2008/04/16/Petit-dejeuner-de-presentation-symfony-le-23-avril-prochain</link>
    <guid isPermaLink="false">urn:md5:bb7e4b693682e49b62355c399c54fa5e</guid>
    <pubDate>Wed, 16 Apr 2008 10:49:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Divers</category>
        <category>php</category><category>symfony</category>    
    <description>    &lt;p&gt;Je me permets de relayer cette information qui pourra intéresser une partie du lectorat de ce blog : &lt;a href=&quot;http://www.sensiolabs.com/&quot; hreflang=&quot;fr&quot;&gt;Sensio Labs&lt;/a&gt; organise le mercredi 23 avril un &lt;a href=&quot;http://www.sensiolabs.com/fr/event/2&quot; hreflang=&quot;fr&quot;&gt;petit-déjeuner de présentation du framework symfony&lt;/a&gt; à destination des sociétés de services en informatiques (SSII, agences web, cabinets de conseil, indépendants, etc.) au &lt;a href=&quot;http://www.sodexho-prestige.fr/fr/2_3/2_3_1.htm&quot; hreflang=&quot;fr&quot;&gt;Centre Etoile Saint-Honoré&lt;/a&gt; (Paris).&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.aide-de-camp.org/&quot; hreflang=&quot;fr&quot;&gt;Fabien Potencier&lt;/a&gt;, créateur de &lt;a href=&quot;http://www.symfony-project.org/&quot; hreflang=&quot;en&quot;&gt;symfony&lt;/a&gt; et développeur principal y présentera les atouts du framework en entreprise et fera quelques annonces sur les perspectives à venir. Ça sera également l'occasion de rencontrer une grande partie de l'équipe en charge du développement du coeur de symfony, de me serrer la pince et de grapiller quelques croissants gratos &lt;img src=&quot;/blog/themes/Puc4/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;N'hésitez pas à vous &lt;a href=&quot;http://www.sensiolabs.com/fr/event/2&quot; hreflang=&quot;fr&quot;&gt;inscrire en ligne sur le site de SensioLabs&lt;/a&gt;.&lt;/p&gt;&lt;hr/&gt;&lt;p style='margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222'&gt;&lt;small&gt;Ce billet intitulé &lt;a href='http://prendreuncafe.com/blog/post/2008/04/16/Petit-dejeuner-de-presentation-symfony-le-23-avril-prochain'&gt;Petit-déjeuner de présentation symfony le 23 avril prochain&lt;/a&gt; a été rédigé par &lt;a href='http://prendreuncafe.com/cv'&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href='http://prendreuncafe.com/blog/'&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href='http://creativecommons.org/licenses/by-nc-sa/2.5/'&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>
