Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The path to Symfony in the USA

The path to Symfony in the USA

The path to Symfony in the USA @ SymfonyLive 2011

Dustin Whittle

February 10, 2011
Tweet

More Decks by Dustin Whittle

Other Decks in Technology

Transcript

  1. This talk will examine how symfony and the community around

    symfony has evolved since 2006. From the release of the initial symfony code to symfony 2.0, and all of the community milestones along the way. The focus of this talk is on how application development has evolved and how symfony and the community have kept pace over the years.
  2. Sensio Labs launches in USA Joining Sensio Labs in a

    partnership to launch services in USA Opening an office in San Francisco Project Consulting Best Practices Consulting / Audits Security Audits Training from open source experts symfony 1, Symfony 2, Doctrine 1, Doctrine 2, PHPUnit
  3. Symfony in the beginning Released open source by Sensio Labs

    in October 2005 Built from years of real world experience in developing web applications Built to improve developer productivity by solving common web problems
  4. Symfony 0.x Developed the core philosophy Don’t reinvent the wheel

    Keep it simple stupid Don’t repeat yourself Invest in unit + functional testing Invest in quality documentation Favor convention over configuration
  5. Defined the core problem set / features Model - View

    - Controller Configuration - YAML + Multiple Environments ORM Integration - CRUD / Admin Generators Routing, Forms, Security, I18n, Caching Developer tools - logging, exceptions, debug toolbar Symfony 0.x
  6. The start of an open source community Launch of symfony-project.com

    Initial tutorials / documentation Support channels on IRC, Forum, Mailing lists Established a core team with distinct leadership from Fabien A way to contribute back on Trac - feedback, bugs, patches Symfony 0.x
  7. The path to symfony 1.2 The original symfony 2! Introduction

    of the event dispatcher Introduction of new sub frameworks Forms / Caching / Tasks Swiftmailer Refactored major components Configuration, Routing, I18n, Admin Generator, Plugins Added support for Doctrine ORM
  8. The path to symfony 1.2 The community starts to mature

    Core team has dedicated release / community managers The community gives back to symfony Plugins + Patches + Documentation + Translations Case studies + Evangelism Community events Our first official meetup at SymfonyCamp
  9. The path to symfony 1.4 A stable + tested version

    of symfony Removed deprecated code (kept in 1.3 instead) Long Term Support A healthy community supports itself Active mailing lists where users support each other Documentation - Translated into six languages Events - SymfonyLive + SymfonyDay
  10. Symfony 2.x Learning from experience Developed from scratch for performance

    and flexibility PHP 5.3 - Support for namespaces and lambdas Better Development Model A collection of independent components A framework for frameworks / full-stack framework Better Community Github enables collaboration + contributions
  11. Symfony 2.x Evolved the philosophy Dependency Injection Container + Event

    Dispatcher Design by interface for a stable API Less Magic = Favor explicit over implicit Don’t reinvent the wheel Doctrine 2 (DBAL / ORM / ODM) Zend Framework 2 (Logger) PHPUnit 3.5.x
  12. Symfony 2.x More flexibility Configuration: YAML, XML, PHP Templating: Twig

    or PHP ORM: Doctrine or Propel More features HTTP Cache ACL Security Asset Management
  13. Symfony 2.x NoSQL via Doctrine 2 MongoDB CouchDB Better testing

    via PHPUnit Jenkins / phpUnderControl Integration Selenium Support Code Coverage Reporting
  14. Symfony 2.x GitHub vs SVN Better core team management Weekly

    IRC Meetings Hackdays / Sprints / Meetups
  15. Available tasks: :help Displays help for a task :list Lists

    tasks app :routes Displays current routes for an application cache :clear Clears the cache (cc) configure :author Configure project author :database Configure database DSN doctrine :build Generate code based on your schema :build-db Creates database for current model (doctrine:create-db) :build-filters Creates filter form classes for the current model :build-forms Creates form classes for the current model :build-model Creates classes for the current model :build-schema Creates a schema from an existing database :build-sql Creates SQL for the current model :clean-model-files Delete all generated model classes for models which no longer exist in your YAML :create-model-tables Drop and recreate tables for specified models. :data-dump Dumps data to the fixtures directory :data-load Loads YAML fixture data :delete-model-files Delete all the related auto generated files for a given model name. :dql Execute a DQL query and view the results :drop-db Drops database for current model :generate-admin Generates a Doctrine admin module :generate-migration Generate migration class :generate-migrations-db Generate migration classes from existing database connections :generate-migrations-diff Generate migration classes by producing a diff between your old and new schema. :generate-migrations-models Generate migration classes from an existing set of models :generate-module Generates a Doctrine module :generate-module-for-route Generates a Doctrine module for a route definition :insert-sql Inserts SQL for current model :migrate Migrates database to current/specified version generate :app Generates a new application :module Generates a new module :project Generates a new project :task Creates a skeleton class for a new task
  16. # You can find more information about this file on

    the symfony website: # http://www.symfony-project.org/reference/1_4/en/04-Settings prod: .settings: no_script_name: true logging_enabled: false dev: .settings: error_reporting: <?php echo (E_ALL | E_STRICT)."\n" ?> web_debug: true cache: false no_script_name: false etag: false test: .settings: error_reporting: <?php echo ((E_ALL | E_STRICT) ^ E_NOTICE)."\n" ?> cache: false web_debug: false no_script_name: false etag: false all: .settings: # Form security secret (CSRF protection) csrf_secret: 1b1783c5ae00e1d90926fb970d5df01c40c8ab98 # Output escaping settings escaping_strategy: true escaping_method: ESC_SPECIALCHARS # Enable the database manager use_database: true Sandbox/apps/frontend/config/settings.yml
  17. # You can find more information about this file on

    the symfony website: # http://www.symfony-project.org/reference/1_4/en/10-Routing # hello module rules hello: url: /hello/:name param: { module: hello, action: index } # default rules homepage: url: / param: { module: default, action: index } sandbox/apps/frontend/config/routing.yml
  18. <?php class helloActions extends sfActions { /** * Executes index

    action * * @param sfRequest $request A request object */ public function executeIndex(sfWebRequest $request) { $this->name = $request->getParameter('name', 'World'); } } sandbox/apps/frontend/modules/hello/actions/actions.class.php
  19. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"

    xml:lang="en" lang="en"> <head> <?php include_http_metas() ?> <?php include_metas() ?> <?php include_title() ?> <link rel="shortcut icon" href="/favicon.ico" /> <?php include_stylesheets() ?> <?php include_javascripts() ?> </head> <body> <?php echo $sf_content ?> </body> </html> sandbox/apps/frontend/templates/layout.php
  20. <?php include(dirname(__FILE__).'/../../bootstrap/functional.php'); $browser = new sfTestFunctional(new sfBrowser()); $browser-> get('/hello/sf')-> with('request')->begin()->

    isParameter('module', 'hello')-> isParameter('action', 'index')-> end()-> with('response')->begin()-> isStatusCode(200)-> checkElement('body', '/Hello sf!/')-> end() ; sandbox/test/functional/frontend/helloActionsTest.php
  21. Available commands: help Displays help for a command (?) list

    Lists commands assets :install cache :warmup Warms up an empty cache doctrine :ensure-production-settings Verify that Doctrine is properly configured for a production environment. doctrine:cache :clear-metadata Clear all metadata cache for a entity manager. :clear-query Clear all query cache for a entity manager. :clear-result Clear result cache for a entity manager. doctrine:data :load Load data fixtures to your database. doctrine:database :create Create the configured databases. :drop Drop the configured databases. doctrine:generate :entities Generate entity classes and method stubs from your mapping information. :entity Generate a new Doctrine entity inside a bundle. :proxies Generates proxy classes for entity classes. :repositories Generate repository classes from your mapping information. doctrine:mapping :convert Convert mapping information between supported formats. :import Import mapping information from an existing database. :info Show basic information about all mapped entities. doctrine:query :dql Executes arbitrary DQL directly from the command line. :sql Executes arbitrary SQL directly from the command line. doctrine:schema :create Processes the schema and either create it directly on EntityManager Storage Connection :drop Drop the complete database schema of EntityManager Storage Connection :update Processes the schema and either update the database schema of EntityManager Storage init :bundle router :debug Displays current routes for an application :dump-apache Dumps all routes as Apache rewrite rules
  22. app.config: charset: UTF-8 error_handler: null csrf_protection: enabled: true secret: xxxxxxxxxx

    router: { resource: "%kernel.root_dir%/config/routing.yml" } validation: { enabled: true, annotations: true } templating: { engines: ['twig'], assets_version: 1.0 } session: default_locale: en lifetime: 3600 auto_start: true twig.config: debug: %kernel.debug% strict_variables: %kernel.debug% doctrine.dbal: dbname: xxxxxxxx user: xxxxxxxx password: ~ logging: %kernel.debug% doctrine.orm: auto_generate_proxy_classes: %kernel.debug% mappings: HelloBundle: ~ swiftmailer.config: transport: gmail username: xxxxxxxx password: xxxxxxxx sandbox/app/config/config.yml
  23. hello: pattern: /hello/{name} defaults: { _controller: HelloBundle:Hello:index } sandbox/src/Sensio/HelloBundle/Resources/config/routing.yml homepage:

    pattern: / defaults: { _controller: FrameworkBundle:Default:index } hello: resource: @HelloBundle/Resources/config/routing.yml sandbox/app/config/routing.yml
  24. <?php namespace Sensio\HelloBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class HelloController extends Controller {

    public function indexAction($name) { return $this->render(‘HelloBundle:Hello:index.html.twig', array('name' => $name)); } } sandbox/src/Sensio/HelloBundle/Controller/HelloController.php
  25. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>{%

    block title %}Hello Application{% endblock %}</ title> </head> <body> {% block body %}{% endblock %} </body> </html> sandbox/app/views/base.html.twig
  26. {% extends "HelloBundle::layout.html.twig" %} {% block content %} Hello {{

    name }}! {% endblock %} sandbox/src/Sensio/HelloBundle/Resources/views/Hello/index.html.twig {% extends "::base.html.twig" %} {% block body %} <h1>Hello Application</h1> {% block content %}{% endblock %} {% endblock %} sandbox/src/Sensio/HelloBundle/Resources/views/layout.html.twig
  27. <?php namespace Sensio\HelloBundle\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class HelloControllerTest extends WebTestCase {

    public function testIndex() { $client = $this->createClient(); $crawler = $client->request('GET', '/hello/Fabien'); $this->assertTrue($crawler->filter('html:contains("Hello Fabien")')->count() > 0); } } sandbox/src/Sensio/HelloBundle/Tests/Controller/HelloController.php
  28. Having a large community of specialists means more contributors and

    better services. The community moves the project faster.