PHP : l’âge de la maturité avec Symfony2 ?


                   Rémi Alvado
                   remi.alvado@gmail.com

                   remi.alvado

                   @remialvado
                   http://blog.shoppingadventure.fr/developers
Rappel des faits

                          Autre
                      Java 1%                                                 Unknown
                       4%                                                       6%
  ASP.Net
   19 %




                                                                    PHP
                          PHP                                       94 %
                          76 %

Répartition des technologies utilisées sur les 1M       Répartition des technologies utilisées sur les
plus gros sites (source : W3Techs)                      CMS totalisant plus de 1% du marché chacun
                                                        (source : W3Techs)




                                                    2
Pr é - H i s t o i r e
PHP 1.0 : 1995

PHP 2.0 : 1997

PHP 3.0 : 1998

    Premières briques d’un modèle objet

PHP 4.0 : 2000
   Premier modèle objet « utilisable »
   Introduction du Zend Engine
   Command Line Interface
PHP 5.0 : 2004, PHP 5.1 : 2005 & PHP 5.2 : 2006
   5.0 : Révision du modèle objet
   5.1 : Amélioration des performances
   5.2 : Introduction de PDO et JSON
                            3
Language
         Namespaces & PSR-0
             Equivalent à la notion de « package » de Java
             Permet le chargement automatique des class


         Annotations
             Non intégré directement au langage
             Implémenté par des librairies externes basées sur l’API Reflection
/**
         Callable
 * @Route(‘/{id}.html’, requirements={‘id’ = ‘d+’}, default={‘id’ = 1})
 * @Method({‘GET’, ‘HEAD’})
             Equivalent aux « closures » de nombreux langages
 * @Template(‘blog/show.html.twig’)
 */
$nbTests = 0;
public function showAction($id) ([^"]*)’),
$steps->Given(‘/I have ordered
{        Futur de PHP
    function($world, $arg1) use ($nbTests) {
}       $nbTests++;
             PHP 5.4 : Traits, built-in webserver, …
         throw new BehatBehatExceptionPendingException();
     }
);           PHP 5.5 : générateurs, coroutines, accesseurs, …


                                              4
Qualité de code
        Composer
             Equivalent à Maven pour la partie dépendance
             Configuration extrêmement simple en JSON
{
        PHPUnit / Hamcrest / Mockery
     "require": {
     "name": "kbrw/riak-bundle",
     "type": "symfony-bundle",
         ”symfony/symfony": ”2.1.*”
     }       Support des assertions classiques, des annotations basiques,
     "description": "Allows your application to intereact with Riak datastorage",
}
             des mocks, de la couverture de code, d’une grande partie
     "keywords": ["webservice","nosql","ODM"],
     "homepage": "https://github.com/remialvado/RiakBundle",
             des matchers Hamcrest, …
     "license": "Apache",
$ curl –s https://getcomposer.org/installer | php
     "authors": [
$ composer install
<?php    {
        Travis–CI / JMS Automatic Code review
require_once "name": "Remi Alvado",
              'SomeClass.php';
             "email": "remi.alvado@gmail.com"
         }
             Serveur de CI utilisé par de nombreux projets PHP
class StubTest extends PHPUnit_Framework_TestCase
{    ],
             Réalisation d’audits automatiques sur le code source
     "require": {
    public function testOnConsecutiveCallsStub()
    {    "php": ">=5.3.2”,
         "guzzle/guzzle": "3.0.*",
         $stub = $this->getMock('SomeClass');
             Intégration aisée avec Git(hub)
         "jms/serializer-bundle": "1.0.*"
         $stub->expects($this->any())
     }        ->method('doSomething')
}             ->will($this->onConsecutiveCalls(2, 3, 5, 7));
         $this->assertEquals(2, $stub->doSomething());
         assertThat($stub->doSomething(), is(3));
   }
}


                                             5
We b s e r v i c e
<?php
namespace BoilerplateSerializerBundle;
       Guzzle
use JMSSerializerAnnotation as Ser;
            Abstraction objet sur curl
/**
            Fortement guidé par les principes REST
 * @XmlRoot("book")
 */
class function searchBooks($query, $tags = array(), $rows = 10, $offset = 0, $sort = "desc")
publicBook
{      JMS Serializer
    /**
    $client = new Client(
            Equivalent allégé à JAXB
     * @SerType("string")
        "http://localhost:9980/books/{q}{?rows,offset,sort,tags*}",
     */ array(
            Fonctionne avec XML, JSON et YAML
    protected $name; => $query,
            "q"
            "rows"   => $rows,
    /**     "offset" => $offset,
            Support des annotations Doctrine
     * @SerType("DateTime")
            "sort"   => $sort,
     * @SerXmlAttribute $tags
            "tags"   =>
     * @SerSerializedName("publication")
        )
     */
    );
    protected $publishedDate;
    $client->setDefaultHeaders(['accept' => 'application/xml']);
}   $request = $client->get();
    echo $request->getUrl();
    $response = $request->send();
<?xml version="1.0" encoding="UTF-8"?>
    echo $response->getBody();
<book publication="2013-01-08 19:30:00">
} <!CDATA[PHP : l’âge de la maturité avec Symfony2 ?]]>
</book>
searchBooks("Star Wars", ['cat' => 'novel', 'country' => 'en-US']);
{"name":"PHP : l’âge de la maturité avec Symfony2 ?","publication":"2013-01-08 19:30:00"}
// http://localhost:9980/books/Star+Wars?rows=10&offset=0&sort=desc&cat=novel&country=en-US
// ...



                                            6
Stockage
Doctrine / Propel
   Equivalent d’Hibernate
   Doctrine 1 / Propel => Active Record pattern
   Génération de code à partir d’une configuration

PHPCR ODM
   Basé sur Java Content Repository
   Intégré dans Doctrine 2
   Encore à l’état de prototype
RiakBundle
   Communication avec Riak
   Intégration complète à Symfony2
   Utilisation de composer, Travis-CI, JMS Automated Code Review, …



                             7
Divers
Assetic : web assets

Twig : templating language

Sismo : micro Continuous Integration server

Silex : micro web framework

Pimple : micro Dependency Injector container

Geocoder

Goutte : web scraper

Monolog : gestion de logs

…


                            8
Conclusion
                                                    Pimple
  Dependency Injection
                                                                         Namespace
                                         Hamcrest                                                  Travis-CI
                           Doctrine
            Monolog
                                                        JMS Serializer                   Built-in webserver
PHPCR
                                     RiakBundle
                                 Sismo                          geocoder
        PHPUnit                                                                               Coroutines

                 Goutte

                           github
                                       Symfony2                                  Autoloader
                                                                                                   DOM Crawler
        Guzzle
                           Annotations                        Code review                        Behat



        Trait                   Propel
                                                             PSR
            Generator                                                                    Composer
                                                                         Silex
                                                Mockery
                                Twig                                                  ESI
  Assetic                                                     Console
                      Event-base development


                                                    9

2013 01-08-php-maturite

  • 1.
    PHP : l’âgede la maturité avec Symfony2 ? Rémi Alvado remi.alvado@gmail.com remi.alvado @remialvado http://blog.shoppingadventure.fr/developers
  • 2.
    Rappel des faits Autre Java 1% Unknown 4% 6% ASP.Net 19 % PHP PHP 94 % 76 % Répartition des technologies utilisées sur les 1M Répartition des technologies utilisées sur les plus gros sites (source : W3Techs) CMS totalisant plus de 1% du marché chacun (source : W3Techs) 2
  • 3.
    Pr é -H i s t o i r e PHP 1.0 : 1995 PHP 2.0 : 1997 PHP 3.0 : 1998 Premières briques d’un modèle objet PHP 4.0 : 2000 Premier modèle objet « utilisable » Introduction du Zend Engine Command Line Interface PHP 5.0 : 2004, PHP 5.1 : 2005 & PHP 5.2 : 2006 5.0 : Révision du modèle objet 5.1 : Amélioration des performances 5.2 : Introduction de PDO et JSON 3
  • 4.
    Language Namespaces & PSR-0 Equivalent à la notion de « package » de Java Permet le chargement automatique des class Annotations Non intégré directement au langage Implémenté par des librairies externes basées sur l’API Reflection /** Callable * @Route(‘/{id}.html’, requirements={‘id’ = ‘d+’}, default={‘id’ = 1}) * @Method({‘GET’, ‘HEAD’}) Equivalent aux « closures » de nombreux langages * @Template(‘blog/show.html.twig’) */ $nbTests = 0; public function showAction($id) ([^"]*)’), $steps->Given(‘/I have ordered { Futur de PHP function($world, $arg1) use ($nbTests) { } $nbTests++; PHP 5.4 : Traits, built-in webserver, … throw new BehatBehatExceptionPendingException(); } ); PHP 5.5 : générateurs, coroutines, accesseurs, … 4
  • 5.
    Qualité de code Composer Equivalent à Maven pour la partie dépendance Configuration extrêmement simple en JSON { PHPUnit / Hamcrest / Mockery "require": { "name": "kbrw/riak-bundle", "type": "symfony-bundle", ”symfony/symfony": ”2.1.*” } Support des assertions classiques, des annotations basiques, "description": "Allows your application to intereact with Riak datastorage", } des mocks, de la couverture de code, d’une grande partie "keywords": ["webservice","nosql","ODM"], "homepage": "https://github.com/remialvado/RiakBundle", des matchers Hamcrest, … "license": "Apache", $ curl –s https://getcomposer.org/installer | php "authors": [ $ composer install <?php { Travis–CI / JMS Automatic Code review require_once "name": "Remi Alvado", 'SomeClass.php'; "email": "remi.alvado@gmail.com" } Serveur de CI utilisé par de nombreux projets PHP class StubTest extends PHPUnit_Framework_TestCase { ], Réalisation d’audits automatiques sur le code source "require": { public function testOnConsecutiveCallsStub() { "php": ">=5.3.2”, "guzzle/guzzle": "3.0.*", $stub = $this->getMock('SomeClass'); Intégration aisée avec Git(hub) "jms/serializer-bundle": "1.0.*" $stub->expects($this->any()) } ->method('doSomething') } ->will($this->onConsecutiveCalls(2, 3, 5, 7)); $this->assertEquals(2, $stub->doSomething()); assertThat($stub->doSomething(), is(3)); } } 5
  • 6.
    We b se r v i c e <?php namespace BoilerplateSerializerBundle; Guzzle use JMSSerializerAnnotation as Ser; Abstraction objet sur curl /** Fortement guidé par les principes REST * @XmlRoot("book") */ class function searchBooks($query, $tags = array(), $rows = 10, $offset = 0, $sort = "desc") publicBook { JMS Serializer /** $client = new Client( Equivalent allégé à JAXB * @SerType("string") "http://localhost:9980/books/{q}{?rows,offset,sort,tags*}", */ array( Fonctionne avec XML, JSON et YAML protected $name; => $query, "q" "rows" => $rows, /** "offset" => $offset, Support des annotations Doctrine * @SerType("DateTime") "sort" => $sort, * @SerXmlAttribute $tags "tags" => * @SerSerializedName("publication") ) */ ); protected $publishedDate; $client->setDefaultHeaders(['accept' => 'application/xml']); } $request = $client->get(); echo $request->getUrl(); $response = $request->send(); <?xml version="1.0" encoding="UTF-8"?> echo $response->getBody(); <book publication="2013-01-08 19:30:00"> } <!CDATA[PHP : l’âge de la maturité avec Symfony2 ?]]> </book> searchBooks("Star Wars", ['cat' => 'novel', 'country' => 'en-US']); {"name":"PHP : l’âge de la maturité avec Symfony2 ?","publication":"2013-01-08 19:30:00"} // http://localhost:9980/books/Star+Wars?rows=10&offset=0&sort=desc&cat=novel&country=en-US // ... 6
  • 7.
    Stockage Doctrine / Propel Equivalent d’Hibernate Doctrine 1 / Propel => Active Record pattern Génération de code à partir d’une configuration PHPCR ODM Basé sur Java Content Repository Intégré dans Doctrine 2 Encore à l’état de prototype RiakBundle Communication avec Riak Intégration complète à Symfony2 Utilisation de composer, Travis-CI, JMS Automated Code Review, … 7
  • 8.
    Divers Assetic : webassets Twig : templating language Sismo : micro Continuous Integration server Silex : micro web framework Pimple : micro Dependency Injector container Geocoder Goutte : web scraper Monolog : gestion de logs … 8
  • 9.
    Conclusion Pimple Dependency Injection Namespace Hamcrest Travis-CI Doctrine Monolog JMS Serializer Built-in webserver PHPCR RiakBundle Sismo geocoder PHPUnit Coroutines Goutte github Symfony2 Autoloader DOM Crawler Guzzle Annotations Code review Behat Trait Propel PSR Generator Composer Silex Mockery Twig ESI Assetic Console Event-base development 9