SlideShare a Scribd company logo
1 of 36
The use of Symfony2
    @ Overblog

 By Xavier HAUSHERR and Gérald Lonlas
About Us




Xavier HAUSHERR     Gerald LONLAS
CTO                 Project manager
 Twitter: @xkobal    Twitter: @geraldlonlas
What is OverBlog?

Born in 2004, OverBlog is the top leading European
blogging platform.

Was the first platform to share the revenue generated by
the audience.

It’s also:
     2 millions blogs in 5 languages
   35 millions uniques visitors per month
   250 millions pages views per month
   13th French site audience
   50 servers to serve blogs
OverBlog before Symfony 2

The previous version of OverBlog is based on:
   Jelix framework 1.1 Custom
   PHP 5.2
   Postgresql 8

Spread on 50 servers:
   1 database master
   11 databases slaves
   38 hits and caches
OverBlog technical specifications


  Capable of handling the load
  Be scalable
  Separate services: may be switch off
  Reducing the pages execution time
  Speed up data access
  Stop with the monolith
  Test driven development
  Take pleasure to develop
PHP Frameworks
Jelix 1.3:
      Small community
     Product continuity


Zend framework 1:
    Not full stack
     Not a framework


Symfony 1:
     End of life
     not enough modular
     performances
Why Symfony 2?




Full stack framework           Young framework
Dependency injection           Too few bundles
Good performances              Strongly coupled with Doctrine
Twig & I18N                    Time/cost to learn
Symfony community
Sensio support
Team experience in Symfony 1
The use of Symfony2 @ Overblog




Service Oriented Architecture
Projects Distribution

One Symfony project for each part of the platform.
Each project must be independent and could be in any language




     Administra-on       Comments            Core


       Developer0
                           Portal           Sta-s-cs
        Center


                        Users00(SSO)
Software Used
Projects Distribution
Service Architecture




       www                      Internal
                                  API


          Front End           Web

                Project API

                Databases
The use of Symfony2 @ Overblog




       Transport Layer
First Try: JSON-RPC

Easy to code
REST is natively integrated into Symfony

Object must be rebuilt from JSON
No type validation
No standard
No data model



               Poor performance
Some statistics about Web Services
                                                            Size (bytes)
      Thrif - TCompactProtocol
        Thrift - TBinaryProtocol
                 Protocol Buffers
Remote Method Invocation (RMI)
                   REST - JSON
                     REST - XML
                                    0   100    200   300    400   500   600    700   800    900   1000



                                        Average Wall Time for 10000 queries (s)
      Thrif - TCompactProtocol
        Thrift - TBinaryProtocol
                 Protocol Buffers
Remote Method Invocation (RMI)
                   REST - JSON
                     REST - XML
                                    0     50     100       150    200    250     300       350    400



                                                       http://jnb.ociweb.com/jnb/jnbJun2009.html
Second Try: Apache Thrift
Developed by Facebook
Incubated by Apache Software Foundation

Object data model
Definition are compiled into classes and interfaces
Cross language
Basic type validation
Binary transfer
PHP extension


No Symfony integration
Obsolete PHP Library
Small community
Thrift Integration In Symfony
                                                  Client                             Server
1. Thrift fork
     Give compatibility with                      Controler                              Business
                                                                                          Service

         UniversalClassLoader
     Real namespace usage



                                                                }
                                                    Thrift
     Remove hardcoded inclusion                    Bundle




                                                                    Generated code
2. We create a bundle to integrate Thrift into
                                                   Service
                                                    client
                                                                                     }    Service
                                                                                           client


   Symfony                                         write () /
                                                    read ()
                                                                                          write () /
                                                                                           read ()
    Dependency injection integration
    Definitions are compiled at cache warmup       TProtocol                              TProtocol

      in cache directory
    Autoloader or Factory to instantiate object   TTransport                             TTransport

    2 modes: HTTP Controller or Socket
      daemon
    Unit Tests
                                                   Input /                                Input /
                                                   output                                 output
3. Work with developers to integrate these
   modifications into the next Thrift release.
Thrift Definition
namespace php ThriftModel.User
namespace java com.overblog.thriftModel.user

include "Generic/Image.thrift"

exception InvalidValueException
{
    1: i32    code,
    2: string message
}

enum Lang
{
    FR,
    EN
}

struct User
{
    1:            i64             id,
    2:            string          email,
    3: optional   string          password,
    4: optional   Image avatar
}

service UserService
{
    User getUserById(1: i64 id) throws (1: InvalidValueException e),
    bool deleteUser(1: i64 id) throws (1: InvalidValueException e)
}
Thrift Integration In Symfony
 services:
      overblog_api.extension.user:
           class: OverblogUserInternalApiBundleApiUserExtension
           arguments: [@service_container]
           tags:
             -: { name: "thrift.extension" }

 overblog_thrift:
   services:
     user:
       definition: User
       namespace: ThriftModelUser
       bundleNameIn: OverblogCommonBundle
       server: true

   servers:
     user:
       service: user
       handler: overblog_api.extension.user

   clients:
     comment:
         service: user
         type: http
         hosts:
           comment:
              host: 192.168.0.1
              port: 8080
Thrift Integration In Symfony
namespace OverblogUserInternalApiBundleController;

use SymfonyBundleFrameworkBundleControllerController;

class UserController extends Controller
{
    public function getUserAction($id)
    {
        try
        {
            $p = $this->get('thrift.client.user')
                      ->getClient()
                      ->getUserById($id);
        }
        catch (Exception $e)
        {
            throw $this->createNotFoundException();
        }
    }
}
Thrift Integration In Symfony
namespace OverblogUserInternalApiBundleApi;

use ThriftModelUserUserIf;
use OverblogThriftBundleApiExtensionsBaseExtension;

class UserExtension extends BaseExtension implements UserIf
{
    public function getUserById($id)
    {
        return
            $this->getInstance(
                'ThriftModelUserUser',
                array(
                    'id'    => $id,
                    'email' => 'user@overblog.com',
                    'lang' => ThriftModelUserLang::FR
                )
            );
      }
}
The use of Symfony2 @ Overblog




Security Bundle: Overblog SSO
Why a SSO ?

Need only one authentication for several services:
•Administration,
•Comments,
•Portal
•Public API (Mobile app)
Session must be checked in PHP or Javascript
Scalability.
Must be able to kill a session
Can be plugged with other system
SSO with Security Bundle

Use the Symfony Security Layer
One provider per service
Bundle creation to secure services
Main entry point is located on SSO
Logout disconnect from project and SSO
Token definition with rights embedded
Use RememberMe functionality to have long authentication
Catch security exception to return 401 instead of redirect
SSO Diagram

                       3. User is prompted to log in



User

               1. User hit a
               protected ressource



                                         2. User is
                                         redirected to SSO



5. User can now                           4. SSO notifies the server that
access the ressource                      access has been granted by
                                          redirecting user with token
The use of Symfony2 @ Overblog




Blog themes with Twig sandbox
Blog rendering

Functional specifications:
   Allow the fully customization of themes
   Friendly meta language


   Sandbox the theme execution
   Cache pages
   Good performance
Why Twig?



The markup
Allow sandboxing & policies
Making our own filters
Compiling theme markup
Packed with Symfony 2
Twig usage




             Twig_loader_string
                 No cache




              Twig_loader_string
                 With cache
Sandbox configuration
# Twig sandbox policy parameters
  sandbox_policy.tags: [if,list]
  sandbox_policy.filters: [capitalize, date, default, upper, lower]
  sandbox_policy.function: [Custom]
  sandbox_policy.properties: {}
  sandbox_policy.methods:
    OverblogThemeServiceBundleModelBlogInterface:
      - getTitle
      - getUrl

# Init Sandbox parameters
twig.extension.sandbox.policy:
    class: Twig_Sandbox_SecurityPolicy
    arguments: [ %sandbox_policy.tags%, %sandbox_policy.filters%,
%sandbox_policy.methods%, %sandbox_policy.properties%,
%sandbox_policy.function% ]

# Enable Twig Sandbox extension
twig.extension.sandbox:
    class: Twig_Extension_Sandbox
    arguments: [@twig.extension.sandbox.policy, false]
Evaluate Twig markup
  $source = '<html>.....</html>';

  require_once '/path/to/lib/Twig/Autoloader.php';
  Twig_Autoloader::register();

  $loader = new Twig_Loader_String();
  $twig = new Twig_Environment($loader, array(
      'cache' => false,
  ));

  $sandboxExtension = new Twig_Extension_Sandbox();
  $sandboxExtension->enableSandbox();
  $twig->addExtension($sandboxExtension);

  try
  {
    // Evaluate theme with Twig Sandbox
    $twig->loadTemplate($source)->render(
       $this->getMockParams()
    );
  }
  catch (Twig_Sandbox_SecurityError $e)
  {
  	 throw new Exception('Syntax not allowed');
  }
The use of Symfony2 @ Overblog




     Internationalization
Internationalization

OverBlog is ported in 5 languages
 English, French, Spanish, Italian, German

Our best combo
 XLIFF format.
 Pootle opensource tool
XLIFF markup

XLIFF generated by Pootle
<trans-unit id="january" approved="yes">
  <source>january</source>
  <target state="translated">January</target>
</trans-unit>
Thanks for your time




                Questions?

   Take some time to create your blog on
           en.over-blog.com
Links

Thrift fork: https://github.com/ebuzzing/thrift
Thrift bundle: https://github.com/ebuzzing/
OverblogThriftBundle
JIRA: https://issues.apache.org/jira/browse/
THRIFT-1615
Pootle: http://translate.sourceforge.net/wiki/
pootle/index

More Related Content

What's hot

Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)James Titcumb
 
Remote method invocation
Remote method invocationRemote method invocation
Remote method invocationDew Shishir
 
Java rmi example program with code
Java rmi example program with codeJava rmi example program with code
Java rmi example program with codekamal kotecha
 
Documenting from the Trenches
Documenting from the TrenchesDocumenting from the Trenches
Documenting from the TrenchesXavier Noria
 
Java Tech & Tools | OSGi Best Practices | Emily Jiang
Java Tech & Tools | OSGi Best Practices | Emily JiangJava Tech & Tools | OSGi Best Practices | Emily Jiang
Java Tech & Tools | OSGi Best Practices | Emily JiangJAX London
 
Remote Method Invocation in JAVA
Remote Method Invocation in JAVARemote Method Invocation in JAVA
Remote Method Invocation in JAVAJalpesh Vasa
 
A Short Java RMI Tutorial
A Short Java RMI TutorialA Short Java RMI Tutorial
A Short Java RMI TutorialGuo Albert
 
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)James Titcumb
 
candi-binding-tutorial
candi-binding-tutorialcandi-binding-tutorial
candi-binding-tutorialtutorialsruby
 
OkAPI meet symfony, symfony meet OkAPI
OkAPI meet symfony, symfony meet OkAPIOkAPI meet symfony, symfony meet OkAPI
OkAPI meet symfony, symfony meet OkAPILukas Smith
 
The Taverna 2 Platform
The Taverna 2 PlatformThe Taverna 2 Platform
The Taverna 2 PlatformTom Oinn
 

What's hot (16)

RMI
RMIRMI
RMI
 
Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)
 
Remote method invocation
Remote method invocationRemote method invocation
Remote method invocation
 
Java rmi example program with code
Java rmi example program with codeJava rmi example program with code
Java rmi example program with code
 
Rmi
RmiRmi
Rmi
 
l-rubysocks-a4
l-rubysocks-a4l-rubysocks-a4
l-rubysocks-a4
 
Rmi
RmiRmi
Rmi
 
Documenting from the Trenches
Documenting from the TrenchesDocumenting from the Trenches
Documenting from the Trenches
 
Java Networking
Java NetworkingJava Networking
Java Networking
 
Java Tech & Tools | OSGi Best Practices | Emily Jiang
Java Tech & Tools | OSGi Best Practices | Emily JiangJava Tech & Tools | OSGi Best Practices | Emily Jiang
Java Tech & Tools | OSGi Best Practices | Emily Jiang
 
Remote Method Invocation in JAVA
Remote Method Invocation in JAVARemote Method Invocation in JAVA
Remote Method Invocation in JAVA
 
A Short Java RMI Tutorial
A Short Java RMI TutorialA Short Java RMI Tutorial
A Short Java RMI Tutorial
 
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)
 
candi-binding-tutorial
candi-binding-tutorialcandi-binding-tutorial
candi-binding-tutorial
 
OkAPI meet symfony, symfony meet OkAPI
OkAPI meet symfony, symfony meet OkAPIOkAPI meet symfony, symfony meet OkAPI
OkAPI meet symfony, symfony meet OkAPI
 
The Taverna 2 Platform
The Taverna 2 PlatformThe Taverna 2 Platform
The Taverna 2 Platform
 

Viewers also liked

Lets play with Symfony2
Lets play with Symfony2Lets play with Symfony2
Lets play with Symfony2Noel GUILBERT
 
Symfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendSymfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendKirill Chebunin
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the TrenchesJonathan Wage
 
Dependency injection with Symfony 2
Dependency injection with Symfony 2Dependency injection with Symfony 2
Dependency injection with Symfony 2cammanderson
 
In The Future We All Use Symfony2
In The Future We All Use Symfony2In The Future We All Use Symfony2
In The Future We All Use Symfony2Brent Shaffer
 
Metrics-Driven Engineering at Etsy
Metrics-Driven Engineering at EtsyMetrics-Driven Engineering at Etsy
Metrics-Driven Engineering at EtsyMike Brittain
 
Optimizing for developer happiness
Optimizing for developer happinessOptimizing for developer happiness
Optimizing for developer happinessChad Dickerson
 
Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...
Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...
Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...Ville Mattila
 
Development is Production Too
Development is Production TooDevelopment is Production Too
Development is Production Toojgoulah
 
Meetic Backend Mutation With Symfony
Meetic Backend Mutation With SymfonyMeetic Backend Mutation With Symfony
Meetic Backend Mutation With SymfonymeeticTech
 
Building Software at Etsy
Building Software at EtsyBuilding Software at Etsy
Building Software at EtsyLauren Sperber
 
Real-time systems at Twitter (Velocity 2012)
Real-time systems at Twitter (Velocity 2012)Real-time systems at Twitter (Velocity 2012)
Real-time systems at Twitter (Velocity 2012)Raffi Krikorian
 
Choose Boring Technology
Choose Boring TechnologyChoose Boring Technology
Choose Boring TechnologyDan McKinley
 
A Whirlwind Tour of Etsy's Monitoring Stack
A Whirlwind Tour of Etsy's Monitoring StackA Whirlwind Tour of Etsy's Monitoring Stack
A Whirlwind Tour of Etsy's Monitoring StackDaniel Schauenberg
 
Managing experimentation
Managing experimentationManaging experimentation
Managing experimentationwilstuckey
 
Scaling Etsy: What Went Wrong, What Went Right
Scaling Etsy: What Went Wrong, What Went RightScaling Etsy: What Went Wrong, What Went Right
Scaling Etsy: What Went Wrong, What Went RightRoss Snyder
 
Web Performance Culture and Tools at Etsy
Web Performance Culture and Tools at EtsyWeb Performance Culture and Tools at Etsy
Web Performance Culture and Tools at EtsyMike Brittain
 
Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Fabien Potencier
 
Design for Continuous Experimentation
Design for Continuous ExperimentationDesign for Continuous Experimentation
Design for Continuous ExperimentationDan McKinley
 

Viewers also liked (20)

Lets play with Symfony2
Lets play with Symfony2Lets play with Symfony2
Lets play with Symfony2
 
Symfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendSymfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friend
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
 
Dependency injection with Symfony 2
Dependency injection with Symfony 2Dependency injection with Symfony 2
Dependency injection with Symfony 2
 
In The Future We All Use Symfony2
In The Future We All Use Symfony2In The Future We All Use Symfony2
In The Future We All Use Symfony2
 
Human Factors and PostMortems
Human Factors and PostMortemsHuman Factors and PostMortems
Human Factors and PostMortems
 
Metrics-Driven Engineering at Etsy
Metrics-Driven Engineering at EtsyMetrics-Driven Engineering at Etsy
Metrics-Driven Engineering at Etsy
 
Optimizing for developer happiness
Optimizing for developer happinessOptimizing for developer happiness
Optimizing for developer happiness
 
Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...
Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...
Running a Scalable And Reliable Symfony2 Application in Cloud (Symfony Sweden...
 
Development is Production Too
Development is Production TooDevelopment is Production Too
Development is Production Too
 
Meetic Backend Mutation With Symfony
Meetic Backend Mutation With SymfonyMeetic Backend Mutation With Symfony
Meetic Backend Mutation With Symfony
 
Building Software at Etsy
Building Software at EtsyBuilding Software at Etsy
Building Software at Etsy
 
Real-time systems at Twitter (Velocity 2012)
Real-time systems at Twitter (Velocity 2012)Real-time systems at Twitter (Velocity 2012)
Real-time systems at Twitter (Velocity 2012)
 
Choose Boring Technology
Choose Boring TechnologyChoose Boring Technology
Choose Boring Technology
 
A Whirlwind Tour of Etsy's Monitoring Stack
A Whirlwind Tour of Etsy's Monitoring StackA Whirlwind Tour of Etsy's Monitoring Stack
A Whirlwind Tour of Etsy's Monitoring Stack
 
Managing experimentation
Managing experimentationManaging experimentation
Managing experimentation
 
Scaling Etsy: What Went Wrong, What Went Right
Scaling Etsy: What Went Wrong, What Went RightScaling Etsy: What Went Wrong, What Went Right
Scaling Etsy: What Went Wrong, What Went Right
 
Web Performance Culture and Tools at Etsy
Web Performance Culture and Tools at EtsyWeb Performance Culture and Tools at Etsy
Web Performance Culture and Tools at Etsy
 
Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4
 
Design for Continuous Experimentation
Design for Continuous ExperimentationDesign for Continuous Experimentation
Design for Continuous Experimentation
 

Similar to The use of Symfony2 @ Overblog

Introduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationIntroduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationKelwin Yang
 
Deep Dive into SpaceONE
Deep Dive into SpaceONEDeep Dive into SpaceONE
Deep Dive into SpaceONEChoonho Son
 
Mike Taulty TechDays 2010 Silverlight 4 - What's New?
Mike Taulty TechDays 2010 Silverlight 4 - What's New?Mike Taulty TechDays 2010 Silverlight 4 - What's New?
Mike Taulty TechDays 2010 Silverlight 4 - What's New?ukdpe
 
Dependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony ContainerDependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony ContainerDiego Lewin
 
Spring training
Spring trainingSpring training
Spring trainingTechFerry
 
OpenShift Meetup - Tokyo - Service Mesh and Serverless Overview
OpenShift Meetup - Tokyo - Service Mesh and Serverless OverviewOpenShift Meetup - Tokyo - Service Mesh and Serverless Overview
OpenShift Meetup - Tokyo - Service Mesh and Serverless OverviewMaría Angélica Bracho
 
Creating a modern web application using Symfony API Platform, ReactJS and Red...
Creating a modern web application using Symfony API Platform, ReactJS and Red...Creating a modern web application using Symfony API Platform, ReactJS and Red...
Creating a modern web application using Symfony API Platform, ReactJS and Red...Jesus Manuel Olivas
 
Distributed Programming using RMI
 Distributed Programming using RMI Distributed Programming using RMI
Distributed Programming using RMIbackdoor
 
Distributed Programming using RMI
Distributed Programming using RMIDistributed Programming using RMI
Distributed Programming using RMIbackdoor
 
Import golang; struct microservice
Import golang; struct microserviceImport golang; struct microservice
Import golang; struct microserviceGiulio De Donato
 
What is new in Symfony 3,3, 3,4, 4.0, 4,1 + Flex
What is new in Symfony 3,3, 3,4, 4.0, 4,1 + FlexWhat is new in Symfony 3,3, 3,4, 4.0, 4,1 + Flex
What is new in Symfony 3,3, 3,4, 4.0, 4,1 + FlexHaehnchen
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterHaehnchen
 
Switch to alfresco with wasaaiq [compatibility mode]
Switch to alfresco with wasaaiq [compatibility mode]Switch to alfresco with wasaaiq [compatibility mode]
Switch to alfresco with wasaaiq [compatibility mode]Alfresco Software
 
Whats new in .net framework 4
Whats new in .net framework 4Whats new in .net framework 4
Whats new in .net framework 4Pramod Chavan
 
Nice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 applicationNice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 applicationMarc Weistroff
 
Protocol
ProtocolProtocol
Protocolm_bahba
 
How Symfony Changed My Life
How Symfony Changed My LifeHow Symfony Changed My Life
How Symfony Changed My LifeMatthias Noback
 

Similar to The use of Symfony2 @ Overblog (20)

Introduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationIntroduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android Application
 
Deep Dive into SpaceONE
Deep Dive into SpaceONEDeep Dive into SpaceONE
Deep Dive into SpaceONE
 
Mike Taulty TechDays 2010 Silverlight 4 - What's New?
Mike Taulty TechDays 2010 Silverlight 4 - What's New?Mike Taulty TechDays 2010 Silverlight 4 - What's New?
Mike Taulty TechDays 2010 Silverlight 4 - What's New?
 
Dependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony ContainerDependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony Container
 
RMI (Remote Method Invocation)
RMI (Remote Method Invocation)RMI (Remote Method Invocation)
RMI (Remote Method Invocation)
 
Spring training
Spring trainingSpring training
Spring training
 
OpenShift Meetup - Tokyo - Service Mesh and Serverless Overview
OpenShift Meetup - Tokyo - Service Mesh and Serverless OverviewOpenShift Meetup - Tokyo - Service Mesh and Serverless Overview
OpenShift Meetup - Tokyo - Service Mesh and Serverless Overview
 
OneTeam Media Server
OneTeam Media ServerOneTeam Media Server
OneTeam Media Server
 
Creating a modern web application using Symfony API Platform, ReactJS and Red...
Creating a modern web application using Symfony API Platform, ReactJS and Red...Creating a modern web application using Symfony API Platform, ReactJS and Red...
Creating a modern web application using Symfony API Platform, ReactJS and Red...
 
Distributed Programming using RMI
 Distributed Programming using RMI Distributed Programming using RMI
Distributed Programming using RMI
 
Distributed Programming using RMI
Distributed Programming using RMIDistributed Programming using RMI
Distributed Programming using RMI
 
Import golang; struct microservice
Import golang; struct microserviceImport golang; struct microservice
Import golang; struct microservice
 
What is new in Symfony 3,3, 3,4, 4.0, 4,1 + Flex
What is new in Symfony 3,3, 3,4, 4.0, 4,1 + FlexWhat is new in Symfony 3,3, 3,4, 4.0, 4,1 + Flex
What is new in Symfony 3,3, 3,4, 4.0, 4,1 + Flex
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
 
Switch to alfresco with wasaaiq [compatibility mode]
Switch to alfresco with wasaaiq [compatibility mode]Switch to alfresco with wasaaiq [compatibility mode]
Switch to alfresco with wasaaiq [compatibility mode]
 
Whats new in .net framework 4
Whats new in .net framework 4Whats new in .net framework 4
Whats new in .net framework 4
 
Distributed objects
Distributed objectsDistributed objects
Distributed objects
 
Nice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 applicationNice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 application
 
Protocol
ProtocolProtocol
Protocol
 
How Symfony Changed My Life
How Symfony Changed My LifeHow Symfony Changed My Life
How Symfony Changed My Life
 

Recently uploaded

"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 

Recently uploaded (20)

"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 

The use of Symfony2 @ Overblog

  • 1. The use of Symfony2 @ Overblog By Xavier HAUSHERR and Gérald Lonlas
  • 2. About Us Xavier HAUSHERR Gerald LONLAS CTO Project manager Twitter: @xkobal Twitter: @geraldlonlas
  • 3. What is OverBlog? Born in 2004, OverBlog is the top leading European blogging platform. Was the first platform to share the revenue generated by the audience. It’s also: 2 millions blogs in 5 languages 35 millions uniques visitors per month 250 millions pages views per month 13th French site audience 50 servers to serve blogs
  • 4. OverBlog before Symfony 2 The previous version of OverBlog is based on: Jelix framework 1.1 Custom PHP 5.2 Postgresql 8 Spread on 50 servers: 1 database master 11 databases slaves 38 hits and caches
  • 5. OverBlog technical specifications Capable of handling the load Be scalable Separate services: may be switch off Reducing the pages execution time Speed up data access Stop with the monolith Test driven development Take pleasure to develop
  • 6. PHP Frameworks Jelix 1.3: Small community Product continuity Zend framework 1: Not full stack Not a framework Symfony 1: End of life not enough modular performances
  • 7. Why Symfony 2? Full stack framework Young framework Dependency injection Too few bundles Good performances Strongly coupled with Doctrine Twig & I18N Time/cost to learn Symfony community Sensio support Team experience in Symfony 1
  • 8. The use of Symfony2 @ Overblog Service Oriented Architecture
  • 9. Projects Distribution One Symfony project for each part of the platform. Each project must be independent and could be in any language Administra-on Comments Core Developer0 Portal Sta-s-cs Center Users00(SSO)
  • 12. Service Architecture www Internal API Front End Web Project API Databases
  • 13. The use of Symfony2 @ Overblog Transport Layer
  • 14. First Try: JSON-RPC Easy to code REST is natively integrated into Symfony Object must be rebuilt from JSON No type validation No standard No data model Poor performance
  • 15. Some statistics about Web Services Size (bytes) Thrif - TCompactProtocol Thrift - TBinaryProtocol Protocol Buffers Remote Method Invocation (RMI) REST - JSON REST - XML 0 100 200 300 400 500 600 700 800 900 1000 Average Wall Time for 10000 queries (s) Thrif - TCompactProtocol Thrift - TBinaryProtocol Protocol Buffers Remote Method Invocation (RMI) REST - JSON REST - XML 0 50 100 150 200 250 300 350 400 http://jnb.ociweb.com/jnb/jnbJun2009.html
  • 16. Second Try: Apache Thrift Developed by Facebook Incubated by Apache Software Foundation Object data model Definition are compiled into classes and interfaces Cross language Basic type validation Binary transfer PHP extension No Symfony integration Obsolete PHP Library Small community
  • 17. Thrift Integration In Symfony Client Server 1. Thrift fork Give compatibility with Controler Business Service UniversalClassLoader Real namespace usage } Thrift Remove hardcoded inclusion Bundle Generated code 2. We create a bundle to integrate Thrift into Service client } Service client Symfony write () / read () write () / read () Dependency injection integration Definitions are compiled at cache warmup TProtocol TProtocol in cache directory Autoloader or Factory to instantiate object TTransport TTransport 2 modes: HTTP Controller or Socket daemon Unit Tests Input / Input / output output 3. Work with developers to integrate these modifications into the next Thrift release.
  • 18. Thrift Definition namespace php ThriftModel.User namespace java com.overblog.thriftModel.user include "Generic/Image.thrift" exception InvalidValueException { 1: i32 code, 2: string message } enum Lang { FR, EN } struct User { 1: i64 id, 2: string email, 3: optional string password, 4: optional Image avatar } service UserService { User getUserById(1: i64 id) throws (1: InvalidValueException e), bool deleteUser(1: i64 id) throws (1: InvalidValueException e) }
  • 19. Thrift Integration In Symfony services: overblog_api.extension.user: class: OverblogUserInternalApiBundleApiUserExtension arguments: [@service_container] tags: -: { name: "thrift.extension" } overblog_thrift: services: user: definition: User namespace: ThriftModelUser bundleNameIn: OverblogCommonBundle server: true servers: user: service: user handler: overblog_api.extension.user clients: comment: service: user type: http hosts: comment: host: 192.168.0.1 port: 8080
  • 20. Thrift Integration In Symfony namespace OverblogUserInternalApiBundleController; use SymfonyBundleFrameworkBundleControllerController; class UserController extends Controller { public function getUserAction($id) { try { $p = $this->get('thrift.client.user') ->getClient() ->getUserById($id); } catch (Exception $e) { throw $this->createNotFoundException(); } } }
  • 21. Thrift Integration In Symfony namespace OverblogUserInternalApiBundleApi; use ThriftModelUserUserIf; use OverblogThriftBundleApiExtensionsBaseExtension; class UserExtension extends BaseExtension implements UserIf { public function getUserById($id) { return $this->getInstance( 'ThriftModelUserUser', array( 'id' => $id, 'email' => 'user@overblog.com', 'lang' => ThriftModelUserLang::FR ) ); } }
  • 22. The use of Symfony2 @ Overblog Security Bundle: Overblog SSO
  • 23. Why a SSO ? Need only one authentication for several services: •Administration, •Comments, •Portal •Public API (Mobile app) Session must be checked in PHP or Javascript Scalability. Must be able to kill a session Can be plugged with other system
  • 24. SSO with Security Bundle Use the Symfony Security Layer One provider per service Bundle creation to secure services Main entry point is located on SSO Logout disconnect from project and SSO Token definition with rights embedded Use RememberMe functionality to have long authentication Catch security exception to return 401 instead of redirect
  • 25. SSO Diagram 3. User is prompted to log in User 1. User hit a protected ressource 2. User is redirected to SSO 5. User can now 4. SSO notifies the server that access the ressource access has been granted by redirecting user with token
  • 26. The use of Symfony2 @ Overblog Blog themes with Twig sandbox
  • 27. Blog rendering Functional specifications: Allow the fully customization of themes Friendly meta language Sandbox the theme execution Cache pages Good performance
  • 28. Why Twig? The markup Allow sandboxing & policies Making our own filters Compiling theme markup Packed with Symfony 2
  • 29. Twig usage Twig_loader_string No cache Twig_loader_string With cache
  • 30. Sandbox configuration # Twig sandbox policy parameters sandbox_policy.tags: [if,list] sandbox_policy.filters: [capitalize, date, default, upper, lower] sandbox_policy.function: [Custom] sandbox_policy.properties: {} sandbox_policy.methods: OverblogThemeServiceBundleModelBlogInterface: - getTitle - getUrl # Init Sandbox parameters twig.extension.sandbox.policy: class: Twig_Sandbox_SecurityPolicy arguments: [ %sandbox_policy.tags%, %sandbox_policy.filters%, %sandbox_policy.methods%, %sandbox_policy.properties%, %sandbox_policy.function% ] # Enable Twig Sandbox extension twig.extension.sandbox: class: Twig_Extension_Sandbox arguments: [@twig.extension.sandbox.policy, false]
  • 31. Evaluate Twig markup $source = '<html>.....</html>'; require_once '/path/to/lib/Twig/Autoloader.php'; Twig_Autoloader::register(); $loader = new Twig_Loader_String(); $twig = new Twig_Environment($loader, array( 'cache' => false, )); $sandboxExtension = new Twig_Extension_Sandbox(); $sandboxExtension->enableSandbox(); $twig->addExtension($sandboxExtension); try { // Evaluate theme with Twig Sandbox $twig->loadTemplate($source)->render( $this->getMockParams() ); } catch (Twig_Sandbox_SecurityError $e) { throw new Exception('Syntax not allowed'); }
  • 32. The use of Symfony2 @ Overblog Internationalization
  • 33. Internationalization OverBlog is ported in 5 languages English, French, Spanish, Italian, German Our best combo XLIFF format. Pootle opensource tool
  • 34. XLIFF markup XLIFF generated by Pootle <trans-unit id="january" approved="yes"> <source>january</source> <target state="translated">January</target> </trans-unit>
  • 35. Thanks for your time Questions? Take some time to create your blog on en.over-blog.com
  • 36. Links Thrift fork: https://github.com/ebuzzing/thrift Thrift bundle: https://github.com/ebuzzing/ OverblogThriftBundle JIRA: https://issues.apache.org/jira/browse/ THRIFT-1615 Pootle: http://translate.sourceforge.net/wiki/ pootle/index

Editor's Notes

  1. \n
  2. \n
  3. Temps : 5min\nLa plateforme europ&amp;#xE9;enne n&amp;#xB0;1\nLancement du nouvel OverBlog avant hier.\n
  4. \n
  5. D&amp;#xE9;but de la r&amp;#xE9;flexion : Septembre 2011\n
  6. Temps : 2min\n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. 5 objet user &amp; 1 objet phone\n
  16. \n
  17. Warmup =&gt; compilerpass\n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. Provider : \nOverblog auth in Postgresql\nFacebook connect\n\nBundle: \n- On embarque le Authentication Provider pour valider le token\n- On utilise le voter pour la gestion des acc&amp;#xE8;s en fonction des droits\n
  25. Le Token est la cl&amp;#xE9; principale pour cr&amp;#xE9;er une session sur tous les projets\nEncryptage avec cl&amp;#xE9; de mani&amp;#xE8;re forte RSA 2048bits\n\nTant que le token &amp; remember-me n&amp;#x2019;ont pas expir&amp;#xE9;, \nle user est loggu&amp;#xE9; et peux cr&amp;#xE9;er une session sur tous les services.\nEffacer le token invalide la sesion\n\n
  26. temps : 5min\n
  27. \n
  28. \n
  29. Twig Sanbox = Validation Theme\n Twig = Affichage\n - Performance\n - Filtre non autoris&amp;#xE9; a executer par OverBlog\n Loader = Twig_Loader_String\n\n
  30. Twig_Extension_Sandbox\n - false = passe uniquement le HTML envoy&amp;#xE9; dans la sandbox\n - true = passe tous les templates par la sandbox\n - Custom = c&amp;#x2019;est une Twig_Function_Method fonction pour la methode Twig Custom(&amp;#x2018;myTitle&amp;#x2019;)\n \n \ndans le themeservice bundle / theme serviceExtension\n&amp;#xA0; &amp;#xA0;public function getFunctions()\n&amp;#xA0; &amp;#xA0;{\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;return array(\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;&apos;Custom&apos; =&gt; new \\Twig_Function_Method(\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;$this,\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;&apos;customMethod&apos;,\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;array(&apos;needs_environment&apos; =&gt; true)\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;)\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;);\n&amp;#xA0; &amp;#xA0;}\n \n \n
  31. Twig_Sandbox_SecurityError ou Twig_Error_Syntax\n
  32. temps : 2min\n
  33. Outils de trad pour nos traduction\nOuverture des acc&amp;#xE8;s a des utilisateurs de confiance, puis la communaut&amp;#xE9;\n
  34. \n
  35. \n
  36. \n