SlideShare una empresa de Scribd logo
1 de 9
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

Más contenido relacionado

La actualidad más candente

Symfony2 & l'architecture Rest
Symfony2 & l'architecture Rest Symfony2 & l'architecture Rest
Symfony2 & l'architecture Rest Ahmed Ghali
 
Premiers pas dans les extensions PHP
Premiers pas dans les extensions PHPPremiers pas dans les extensions PHP
Premiers pas dans les extensions PHPPierrick Charron
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4julien pauli
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesNoel GUILBERT
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2Hugo Hamon
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkHugo Hamon
 
Suivi qualité avec sonar pour php
Suivi qualité avec sonar pour phpSuivi qualité avec sonar pour php
Suivi qualité avec sonar pour phpGabriele Santini
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsCocoaHeads France
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs rubypinguin666
 

La actualidad más candente (19)

Symfony2 & l'architecture Rest
Symfony2 & l'architecture Rest Symfony2 & l'architecture Rest
Symfony2 & l'architecture Rest
 
Premiers pas dans les extensions PHP
Premiers pas dans les extensions PHPPremiers pas dans les extensions PHP
Premiers pas dans les extensions PHP
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiques
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
 
Suivi qualité avec sonar pour php
Suivi qualité avec sonar pour phpSuivi qualité avec sonar pour php
Suivi qualité avec sonar pour php
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs ruby
 

Similar a 2013 01-08-php-maturite

Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...Microsoft
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejsnaholyr
 
retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2Saad Tazi
 
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs WebUne visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs WebFrédéric Harper
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Diaporama du sfPot Lillois du 20 mars 2014
Diaporama du sfPot Lillois du 20 mars 2014Diaporama du sfPot Lillois du 20 mars 2014
Diaporama du sfPot Lillois du 20 mars 2014Les-Tilleuls.coop
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Normandie Web Xperts
 
Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?GreenIvory
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Jean-Laurent de Morlhon
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!CARA_Lyon
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!CARA_Lyon
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...sametmax
 
Intellicore Tech Talk 10 - Apache Web Server Internals
Intellicore Tech Talk 10 - Apache Web Server InternalsIntellicore Tech Talk 10 - Apache Web Server Internals
Intellicore Tech Talk 10 - Apache Web Server InternalsNeil Armstrong
 

Similar a 2013 01-08-php-maturite (20)

Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2
 
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs WebUne visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Diaporama du sfPot Lillois du 20 mars 2014
Diaporama du sfPot Lillois du 20 mars 2014Diaporama du sfPot Lillois du 20 mars 2014
Diaporama du sfPot Lillois du 20 mars 2014
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
 
Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Tour Horizont.Net
Tour Horizont.NetTour Horizont.Net
Tour Horizont.Net
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
 
Intellicore Tech Talk 10 - Apache Web Server Internals
Intellicore Tech Talk 10 - Apache Web Server InternalsIntellicore Tech Talk 10 - Apache Web Server Internals
Intellicore Tech Talk 10 - Apache Web Server Internals
 

2013 01-08-php-maturite

  • 1. PHP : l’âge de 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 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
  • 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 : 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
  • 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