SlideShare a Scribd company logo
Symfony @ OpenSky
Pablo Godel
Symfony @ OpenSky
What is OpenSky?
Symfony @ OpenSky
What is OpenSky?
• Multiple businesses powered by Symfony:
1. opensky.com
2. dotandbo.com
3. 55mulberry.com
Symfony @ OpenSky
What is OpenSky?
• Multiple businesses powered by Symfony:
1. opensky.com
2. dotandbo.com
3. 55mulberry.com
• +100 employees
Symfony @ OpenSky
What is OpenSky?
• Multiple businesses powered by Symfony:
1. opensky.com
2. dotandbo.com
3. 55mulberry.com
• +100 employees
• Offices all around the world in New York,
Portland, Nashville, Miami, Chico,
Bucharest and Los Angeles
Symfony @ OpenSky
HISTORY
Symfony @ OpenSky
HISTORY
Symfony @ OpenSky
• Early adopter of Symfony2 in 2010 before 2.0
stable was released
History
Symfony @ OpenSky
• Early adopter of Symfony2 in 2010 before 2.0
stable was released
• Migrated from Magento -> symfony1 ->
Symfony2
History
Symfony @ OpenSky
• Early adopter of Symfony2 in 2010 before 2.0
stable was released
• Migrated from Magento -> symfony1 ->
Symfony2
• Aspects of Magento cart utilized throughout
migration process until completely phased
out with proprietary cart/checkout technology
History
Symfony @ OpenSky
THE CURRENT STACK
Symfony @ OpenSky
• Symfony 2.8
• RequireJS + Backbone
• PHP 7.1.10
• MySQL 5.6 + MongoDB 3.2
• Redis
• Varnish + Nginx
• VMWare
• Vagrant + VirtualBox for Dev VMs
The Current Stack
Symfony @ OpenSky
• ~400 Controllers
• +800 Routes
• ~1,900 Services
• 285 Commands
• 374 Entities
• 467 Documents
• 808,532 LoC
• 3,738 Classes
• 156 Interfaces
• 46 Traits
• +10,000 Unit Tests
The Current Stack
Symfony @ OpenSky
The Current Stack
Symfony @ OpenSky
The Current Stack
Symfony @ OpenSky
CODING WORKFLOW
Symfony @ OpenSky
Symfony at OpenSky
GitHub Enterprise
GitHub Enterprise
Coding workflow
Symfony @ OpenSky
• production branch (master)
Coding workflow
Symfony @ OpenSky
• production branch (master)
• feature / fix branches
Coding workflow
Symfony @ OpenSky
• production branch (master)
• feature / fix branches
• Pull Requests linked to JIRA
Coding workflow
Symfony @ OpenSky
• production branch (master)
• feature / fix branches
• Pull Requests linked to JIRA
• Integration with Jenkins for Unit/
Functional Tests
Coding workflow
Symfony @ OpenSky
• production branch (master)
• feature / fix branches
• Pull Requests linked to JIRA
• Integration with Jenkins for Unit/
Functional Tests
• Pre-commit Hooks for php-cs-fixer,
gulp-jshint, gulp-sass-lint
Coding workflow
Symfony @ OpenSky
• Symfony Coding Standards
Coding workflow
Symfony @ OpenSky
• Symfony Coding Standards
• Short Array Syntax
Coding workflow
Symfony @ OpenSky
• Symfony Coding Standards
• Short Array Syntax
• Ordered Use Statements
Coding workflow
Symfony @ OpenSky
• Symfony Coding Standards
• Short Array Syntax
• Ordered Use Statements
• Ensuring an EOL at end of file
Coding workflow
Symfony @ OpenSky
• PHP7 Type-Hints when possible
Coding workflow
Symfony @ OpenSky
• PHP7 Type-Hints when possible
• DocBlocks only when adds clarity
Coding workflow
Symfony @ OpenSky
• PHP7 Type-Hints when possible
• DocBlocks only when adds clarity
• ClassName::class
Coding workflow
Symfony @ OpenSky
• PHP7 Type-Hints when possible
• DocBlocks only when adds clarity
• ClassName::class
• ‘NamespaceClassName’
Coding workflow
Symfony @ OpenSky
• PHP7 Type-Hints when possible
• DocBlocks only when adds clarity
• ClassName::class
• ‘NamespaceClassName’
• In forms use class constant
Coding workflow
Symfony @ OpenSky
• PHP7 Type-Hints when possible
• DocBlocks only when adds clarity
• ClassName::class
• ‘NamespaceClassName’
• In forms use class constant
• $builder->add('name', TextType::class);
Coding workflow
Symfony @ OpenSky
• PHP7 Type-Hints when possible
• DocBlocks only when adds clarity
• ClassName::class
• ‘NamespaceClassName’
• In forms use class constant
• $builder->add('name', TextType::class);
• Always use ‘use’ statement
• $time = new DateTime()
Coding workflow
Symfony @ OpenSky
Before production deployment:
Coding workflow
Symfony @ OpenSky
Before production deployment:
• Peer Reviews using GitHub PRs
Coding workflow
Symfony @ OpenSky
Before production deployment:
• Peer Reviews using GitHub PRs
• 100% test pass (unit & functional)
Coding workflow
Symfony @ OpenSky
Before production deployment:
• Peer Reviews using GitHub PRs
• 100% test pass (unit & functional)
• Integration deploy/testing
Coding workflow
Symfony @ OpenSky
Before production deployment:
• Peer Reviews using GitHub PRs
• 100% test pass (unit & functional)
• Integration deploy/testing
• UA / QA pass (tracked in JIRA)
Coding workflow
Symfony @ OpenSky
SYMFONY BUNDLES
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
Symfony Bundles
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
• MainBundle
Symfony Bundles
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
• MainBundle
• AdminBundle (500+ routes, 300 extra
services in the container)
Symfony Bundles
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
• MainBundle
• AdminBundle (500+ routes, 300 extra
services in the container)
• APIBundle
Symfony Bundles
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
• MainBundle
• AdminBundle (500+ routes, 300 extra
services in the container)
• APIBundle
• 3rd Party Bundles
Symfony Bundles
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
• MainBundle
• AdminBundle (500+ routes, 300 extra
services in the container)
• APIBundle
• 3rd Party Bundles
• AvalancheImagineBundle
Symfony Bundles
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
• MainBundle
• AdminBundle (500+ routes, 300 extra
services in the container)
• APIBundle
• 3rd Party Bundles
• AvalancheImagineBundle
• FOSUserBundle
Symfony Bundles
Symfony @ OpenSky
• Split things into broad bundles. Don’t over
bundle.
• MainBundle
• AdminBundle (500+ routes, 300 extra
services in the container)
• APIBundle
• 3rd Party Bundles
• AvalancheImagineBundle
• FOSUserBundle
• Using 3rd party bundles may impact
maintainability in the long term
Symfony Bundles
Symfony @ OpenSky
DOCTRINE
Symfony @ OpenSky
• MongoDB and MySQL together
Doctrine
Symfony @ OpenSky
• MongoDB and MySQL together
• References between MongoDB and MySQL
Doctrine
Symfony @ OpenSky
• MongoDB and MySQL together
• References between MongoDB and MySQL
• Using the Doctrine ORM & MongoDB ODM to
make the models for the two databases
transparent to the application.
Doctrine
Symfony @ OpenSky
• MongoDB and MySQL together
• References between MongoDB and MySQL
• Using the Doctrine ORM & MongoDB ODM to
make the models for the two databases
transparent to the application.
• Never delete data due to referential integrity
problems. Use soft delete (deletedAt)
Doctrine
Symfony @ OpenSky
• MongoDB and MySQL together
• References between MongoDB and MySQL
• Using the Doctrine ORM & MongoDB ODM to
make the models for the two databases
transparent to the application.
• Never delete data due to referential integrity
problems. Use soft delete (deletedAt)
• Traits for common functionality like createdAt/
updatedAt/deletedAt
Doctrine
Symfony @ OpenSky
Symfony @ OpenSky
• How long did it take to run?
Doctrine Migrations
Symfony @ OpenSky
• How long did it take to run?
• Is it backwards compatible?
Doctrine Migrations
Symfony @ OpenSky
• How long did it take to run?
• Is it backwards compatible?
• Up & Down
Doctrine Migrations
Symfony @ OpenSky
• How long did it take to run?
• Is it backwards compatible?
• Up & Down
• schema.sql / data.sql up-to-date
Doctrine Migrations
Symfony @ OpenSky
• How long did it take to run?
• Is it backwards compatible?
• Up & Down
• schema.sql / data.sql up-to-date
• Add indexes
Doctrine Migrations
Symfony @ OpenSky
• How long did it take to run?
• Is it backwards compatible?
• Up & Down
• schema.sql / data.sql up-to-date
• Add indexes
• Remove data later in separate
migration
Doctrine Migrations
Symfony @ OpenSky
SYMFONY MISC
Symfony @ OpenSky
• Lean
Controllers
Symfony @ OpenSky
• Lean
• No Business Logic
Controllers
Symfony @ OpenSky
• Lean
• No Business Logic
• Only Flow control
Controllers
Symfony @ OpenSky
• Lean
• No Business Logic
• Only Flow control
• Extend Custom BaseController
Controllers
Symfony @ OpenSky
• Two tiers of authentication implemented using role
voters.
Security
Symfony @ OpenSky
• Two tiers of authentication implemented using role
voters.
• PartiallyAuthenticatedVoter
Security
Symfony @ OpenSky
• Two tiers of authentication implemented using role
voters.
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
Security
Symfony @ OpenSky
• Two tiers of authentication implemented using role
voters.
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
• When a user is recently authenticated, they are logged
in to 2nd tier of authentication and have access to
account, checkout, etc. After 15 minutes of inactivity,
user is logged out of 2nd tier.
Security
Symfony @ OpenSky
• Two tiers of authentication implemented using role
voters.
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
• When a user is recently authenticated, they are logged
in to 2nd tier of authentication and have access to
account, checkout, etc. After 15 minutes of inactivity,
user is logged out of 2nd tier.
• Admin integrates with LDAP (using zendframework/
zend-ldap)
Security
Symfony @ OpenSky
• Two tiers of authentication implemented using role
voters.
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
• When a user is recently authenticated, they are logged
in to 2nd tier of authentication and have access to
account, checkout, etc. After 15 minutes of inactivity,
user is logged out of 2nd tier.
• Admin integrates with LDAP (using zendframework/
zend-ldap)
• Multiple firewalls/authentication providers for consumer
facing, admin and api.
Security
Symfony @ OpenSky
Runtime Settings/Parameters
• Parameters defined in config/parameters.yml
Symfony @ OpenSky
• Parameters defined in config/parameters.yml
• Override stored in MongoDB
Runtime Settings/Parameters
Symfony @ OpenSky
• Parameters defined in config/parameters.yml
• Override stored in MongoDB
• Parameters can have start & end datetime
Runtime Settings/Parameters
Symfony @ OpenSky
• Parameters defined in config/parameters.yml
• Override stored in MongoDB
• Parameters can have start & end datetime
• All parameters stored in cache
Runtime Settings/Parameters
Symfony @ OpenSky
• Parameters defined in config/parameters.yml
• Override stored in MongoDB
• Parameters can have start & end datetime
• All parameters stored in cache
• When parameter value is changed, cache is
updated and queue workers restarted
Runtime Settings/Parameters
Symfony @ OpenSky
• Parameters defined in config/parameters.yml
• Override stored in MongoDB
• Parameters can have start & end datetime
• All parameters stored in cache
• When parameter value is changed, cache is
updated and queue workers restarted
• Allows for configuration changes without
deployment
Runtime Settings/Parameters
Symfony @ OpenSky
• Parameters defined in config/parameters.yml
• Override stored in MongoDB
• Parameters can have start & end datetime
• All parameters stored in cache
• When parameter value is changed, cache is
updated and queue workers restarted
• Allows for configuration changes without
deployment
• Heavily used for feature flags and enable/
disable of new features
Runtime Settings/Parameters
Symfony @ OpenSky
Runtime Settings/Parameters
Symfony @ OpenSky
Runtime Settings/Parameters
Symfony @ OpenSky
Runtime Settings/Parameters
Symfony @ OpenSky
EVENTS
Symfony @ OpenSky
• Perform tasks after the response has been sent
to client
Event kernel.terminate
Symfony @ OpenSky
• Perform tasks after the response has been sent
to client
• Store Request Log in MongoDB Collection
Event kernel.terminate
Symfony @ OpenSky
• Perform tasks after the response has been sent
to client
• Store Request Log in MongoDB Collection
• Analyze request for further actions
Event kernel.terminate
Symfony @ OpenSky
• Perform tasks after the response has been sent
to client
• Store Request Log in MongoDB Collection
• Analyze request for further actions
• Only effective with FastCGI
Event kernel.terminate
Symfony @ OpenSky
• Queueing events for async functionality
Events system
Symfony @ OpenSky
• Queueing events for async functionality
• Event serializer/unserializer
Events system
Symfony @ OpenSky
• Queueing events for async functionality
• Event serializer/unserializer
• Scheduling events
Events system
Symfony @ OpenSky
• Queueing events for async functionality
• Event serializer/unserializer
• Scheduling events
• Event retries, retry max amount
Events system
Symfony @ OpenSky
• Queueing events for async functionality
• Event serializer/unserializer
• Scheduling events
• Event retries, retry max amount
• One queue per mongodb collection
Events system
Symfony @ OpenSky
• Queueing events for async functionality
• Event serializer/unserializer
• Scheduling events
• Event retries, retry max amount
• One queue per mongodb collection
• Queue workers managed with Supervisord
Events system
Symfony @ OpenSky
Events system
Symfony @ OpenSky
Events system
Symfony @ OpenSky
Events system
Symfony @ OpenSky
Events system
Symfony @ OpenSky
Events system
Symfony @ OpenSky
SLACK
Symfony @ OpenSky
• php-kip using yabot
Slack integration
Symfony @ OpenSky
• php-kip using yabot
• Production deploy queue/line
Slack integration
Symfony @ OpenSky
• php-kip using yabot
• Production deploy queue/line
• Dev environment reservations & deploys
Slack integration
Symfony @ OpenSky
Symfony at OpenSky
Php-kip using yubot
- Production deploy queue/line
- Dev environment deploys
Slack integration
Symfony @ OpenSky
Symfony at OpenSky
Php-kip using yubot
- Production deploy queue/line
- Dev environment deploys
Slack integration
Symfony @ OpenSky
Symfony at OpenSky
Php-kip using yubot
- Production deploy queue/line
- Dev environment deploys
Slack integration
Symfony @ OpenSky
Slack integration
Symfony @ OpenSky
Slack integration
Symfony @ OpenSky
Slack integration
Symfony @ OpenSky
SEARCH
Symfony @ OpenSky
Search
• Integration with Algolia
Symfony @ OpenSky
• Integration with Algolia
• algolia/algoliasearch-client-php
Search
Symfony @ OpenSky
• Integration with Algolia
• algolia/algoliasearch-client-php
• Update index through async Event
Listeners
Search
Symfony @ OpenSky
Payments
• Integration with Braintree Payments
• braintree/braintree_php
Symfony @ OpenSky
• NPM
• jQuery
• RequireJS
• Backbone
• TwigJS
• Gulp / Less / Sass
The Frontend
Symfony @ OpenSky
• A/B Split Testing using Optimizely for
testing UI/UX changes
• Send small % of traffic to new features
• GoogleAnalytics tracking conversion rate
The Frontend
Symfony @ OpenSky
TESTING
Symfony @ OpenSky
• pr-nightmare
Testing
Symfony @ OpenSky
• pr-nightmare
• Runs on all commits and pull requests
Testing
Symfony @ OpenSky
• pr-nightmare
• Runs on all commits and pull requests
• Uses PHPChunkit to run 30 minutes of tests in 3
minutes by running groups of tests in parallel
across multiple servers. 

https://github.com/jwage/phpchunkit
Testing
Symfony @ OpenSky
• pr-nightmare
• Runs on all commits and pull requests
• Uses PHPChunkit to run 30 minutes of tests in 3
minutes by running groups of tests in parallel
across multiple servers. 

https://github.com/jwage/phpchunkit
• Selenium for browser functional testing
Testing
Symfony @ OpenSky
Testing
Symfony @ OpenSky
• ‘@app admin’ annotation to indicate web test
cases which app/kernel to boot up
Testing with PHPUnit
Symfony @ OpenSky
• ‘@app admin’ annotation to indicate web test
cases which app/kernel to boot up
• AutoDataCleanupListener keeps tracks of what
collections and tables were inserted to in a test
and cleans up afterwards. This used to be
explicitly required by the developer but happens
automatically now
Testing with PHPUnit
Symfony @ OpenSky
• ‘@app admin’ annotation to indicate web test
cases which app/kernel to boot up
• AutoDataCleanupListener keeps tracks of what
collections and tables were inserted to in a test
and cleans up afterwards. This used to be
explicitly required by the developer but happens
automatically now
• AbstractTwigLintTest: Twig linting. Loads up all twig
files to make sure there are no parse errors
Testing with PHPUnit
Symfony @ OpenSky
• ‘@app admin’ annotation to indicate web test
cases which app/kernel to boot up
• AutoDataCleanupListener keeps tracks of what
collections and tables were inserted to in a test
and cleans up afterwards. This used to be
explicitly required by the developer but happens
automatically now
• AbstractTwigLintTest: Twig linting. Loads up all twig
files to make sure there are no parse errors
• Generating unit tests from class definitions
Testing with PHPUnit
Symfony @ OpenSky
• ‘@app admin’ annotation to indicate web test
cases which app/kernel to boot up
• AutoDataCleanupListener keeps tracks of what
collections and tables were inserted to in a test
and cleans up afterwards. This used to be
explicitly required by the developer but happens
automatically now
• AbstractTwigLintTest: Twig linting. Loads up all twig
files to make sure there are no parse errors
• Generating unit tests from class definitions
• PHPUnit watch command
Testing with PHPUnit
Symfony @ OpenSky
Testing with PHPUnit
Symfony @ OpenSky
Testing with PHPUnit
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
Twig Lint with PHPUnit
Symfony @ OpenSky
Twig Lint with PHPUnit
Symfony @ OpenSky
Twig Lint with PHPUnit
Symfony @ OpenSky
DEPLOYMENT
Symfony @ OpenSky
Deployment
• Use Customized Fabric
• Manually started from Jenkins
• First build task
• Merge feature/fix branch into
master
• Create Tag
Symfony @ OpenSky
• Final build task
• git checkout
• composer install --no-dev —no-scripts
• Build front controller
• Run gulp, requires, less, sass
• Warmup cache for each app
• Assetic dump
• Build artifacts file & distribute it to
servers
• Run MySQL & MongoDB Migrations
• Rotate logs
• Restart php-fpm
• Reload Varnish and nginx
• Restart queue workers
Deployment
• Use Customized Fabric
• Manually started from Jenkins
• First build task
• Merge feature/fix branch into
master
• Create Tag
Symfony @ OpenSky
Questions?
Symfony @ OpenSky
Thank you!
Pablo Godel
@pgodel
http://slideshare.net/pgodel https://joind.in/talk/bfd1e

More Related Content

What's hot (20)

Advanced Server Integration with Data and Direct
Advanced Server Integration with Data and DirectAdvanced Server Integration with Data and Direct
Advanced Server Integration with Data and Direct
Sencha
 
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with BehatGrand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Ryan Weaver
 
ColdFusion builder plugins
ColdFusion builder pluginsColdFusion builder plugins
ColdFusion builder plugins
ColdFusionConference
 
Symfony2: Get your project started
Symfony2: Get your project startedSymfony2: Get your project started
Symfony2: Get your project started
Ryan Weaver
 
Composer Power User Tips
Composer Power User TipsComposer Power User Tips
Composer Power User Tips
Tom Corrigan
 
Symfony 4: A new way to develop applications #phpsrb
 Symfony 4: A new way to develop applications #phpsrb Symfony 4: A new way to develop applications #phpsrb
Symfony 4: A new way to develop applications #phpsrb
Antonio Peric-Mazar
 
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
daylerees
 
MVC Gems
MVC GemsMVC Gems
MVC Gems
Kir Shatrov
 
php[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground Upphp[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground Up
Joe Ferguson
 
php[world] 2015 Laravel 5.1: From Homestead to the Cloud
php[world] 2015 Laravel 5.1: From Homestead to the Cloudphp[world] 2015 Laravel 5.1: From Homestead to the Cloud
php[world] 2015 Laravel 5.1: From Homestead to the Cloud
Joe Ferguson
 
Digpen 7: Why choose Laravel?
Digpen 7: Why choose Laravel?Digpen 7: Why choose Laravel?
Digpen 7: Why choose Laravel?
John Blackmore
 
Master the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexMaster the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and Silex
Ryan Weaver
 
What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)
What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)
What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)
Roes Wibowo
 
XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS) Par Jean-...
XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS)  Par Jean-...XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS)  Par Jean-...
XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS) Par Jean-...
Publicis Sapient Engineering
 
Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...
Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...
Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...
Nicholas Dionysopoulos
 
Knowing Laravel 5 : The most popular PHP framework
Knowing Laravel 5 : The most popular PHP frameworkKnowing Laravel 5 : The most popular PHP framework
Knowing Laravel 5 : The most popular PHP framework
Bukhori Aqid
 
Saving Time By Testing With Jest
Saving Time By Testing With JestSaving Time By Testing With Jest
Saving Time By Testing With Jest
Ben McCormick
 
Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016
Clark Everetts
 
Avik_RailsTutorial
Avik_RailsTutorialAvik_RailsTutorial
Avik_RailsTutorial
tutorialsruby
 
Automated deployments using envoy by John Blackmore
Automated deployments using envoy by John BlackmoreAutomated deployments using envoy by John Blackmore
Automated deployments using envoy by John Blackmore
TechExeter
 
Advanced Server Integration with Data and Direct
Advanced Server Integration with Data and DirectAdvanced Server Integration with Data and Direct
Advanced Server Integration with Data and Direct
Sencha
 
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with BehatGrand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Ryan Weaver
 
Symfony2: Get your project started
Symfony2: Get your project startedSymfony2: Get your project started
Symfony2: Get your project started
Ryan Weaver
 
Composer Power User Tips
Composer Power User TipsComposer Power User Tips
Composer Power User Tips
Tom Corrigan
 
Symfony 4: A new way to develop applications #phpsrb
 Symfony 4: A new way to develop applications #phpsrb Symfony 4: A new way to develop applications #phpsrb
Symfony 4: A new way to develop applications #phpsrb
Antonio Peric-Mazar
 
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
daylerees
 
php[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground Upphp[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground Up
Joe Ferguson
 
php[world] 2015 Laravel 5.1: From Homestead to the Cloud
php[world] 2015 Laravel 5.1: From Homestead to the Cloudphp[world] 2015 Laravel 5.1: From Homestead to the Cloud
php[world] 2015 Laravel 5.1: From Homestead to the Cloud
Joe Ferguson
 
Digpen 7: Why choose Laravel?
Digpen 7: Why choose Laravel?Digpen 7: Why choose Laravel?
Digpen 7: Why choose Laravel?
John Blackmore
 
Master the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexMaster the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and Silex
Ryan Weaver
 
What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)
What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)
What's New in Laravel 5 (Laravel Meetup - 23th Apr 15, Yogyakarta, ID)
Roes Wibowo
 
XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS) Par Jean-...
XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS)  Par Jean-...XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS)  Par Jean-...
XebiCon'16 : Fastlane : Automatisez votre vie (de développeur iOS) Par Jean-...
Publicis Sapient Engineering
 
Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...
Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...
Joomla! Day Poland 2012 - Advanced Akeeba Backup - Beyond just backing up you...
Nicholas Dionysopoulos
 
Knowing Laravel 5 : The most popular PHP framework
Knowing Laravel 5 : The most popular PHP frameworkKnowing Laravel 5 : The most popular PHP framework
Knowing Laravel 5 : The most popular PHP framework
Bukhori Aqid
 
Saving Time By Testing With Jest
Saving Time By Testing With JestSaving Time By Testing With Jest
Saving Time By Testing With Jest
Ben McCormick
 
Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016
Clark Everetts
 
Automated deployments using envoy by John Blackmore
Automated deployments using envoy by John BlackmoreAutomated deployments using envoy by John Blackmore
Automated deployments using envoy by John Blackmore
TechExeter
 

Similar to Symfony Live San Francisco 2017 - Symfony @ OpenSky (20)

Migration of a legacy project to Symfony
Migration of a legacy project to SymfonyMigration of a legacy project to Symfony
Migration of a legacy project to Symfony
Pixel Federation
 
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 -  Rock Solid Deployment of Symfony AppsSymfony Live NYC 2014 -  Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
Pablo Godel
 
Code review and security audit in private cloud - Arief Karfianto
Code review and security audit in private cloud - Arief KarfiantoCode review and security audit in private cloud - Arief Karfianto
Code review and security audit in private cloud - Arief Karfianto
idsecconf
 
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony AppsSymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
Pablo Godel
 
Unit testing symfony plugins with php unit
Unit testing symfony plugins with php unitUnit testing symfony plugins with php unit
Unit testing symfony plugins with php unit
Christian Schaefer
 
Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009
Fabien Potencier
 
Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3
Fabien Potencier
 
Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...
Niels Frydenholm
 
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Edward Wilde
 
Modern websites in 2020 and Joomla
Modern websites in 2020 and JoomlaModern websites in 2020 and Joomla
Modern websites in 2020 and Joomla
George Wilson
 
Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011
Vincent Partington
 
Lightning Fast SCADA Development with Open Library for WinCC OA
Lightning Fast SCADA Development with Open Library for WinCC OA Lightning Fast SCADA Development with Open Library for WinCC OA
Lightning Fast SCADA Development with Open Library for WinCC OA
DMC, Inc.
 
Steamlining your puppet development workflow
Steamlining your puppet development workflowSteamlining your puppet development workflow
Steamlining your puppet development workflow
Tomas Doran
 
Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet
 
Mozmill Crowd
Mozmill CrowdMozmill Crowd
Mozmill Crowd
Henrik Skupin
 
Symfony4 - Deep dive
Symfony4 - Deep diveSymfony4 - Deep dive
Symfony4 - Deep dive
Salma Ghareeb
 
Version Control With Subversion
Version Control With SubversionVersion Control With Subversion
Version Control With Subversion
Samnang Chhun
 
Ci for i-os-codemash-01.2013
Ci for i-os-codemash-01.2013Ci for i-os-codemash-01.2013
Ci for i-os-codemash-01.2013
Kevin Munc
 
Hands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkHands-on with the Symfony2 Framework
Hands-on with the Symfony2 Framework
Ryan Weaver
 
Rabbits, indians and... Symfony meets queueing brokers
Rabbits, indians and...  Symfony meets queueing brokersRabbits, indians and...  Symfony meets queueing brokers
Rabbits, indians and... Symfony meets queueing brokers
Gaetano Giunta
 
Migration of a legacy project to Symfony
Migration of a legacy project to SymfonyMigration of a legacy project to Symfony
Migration of a legacy project to Symfony
Pixel Federation
 
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 -  Rock Solid Deployment of Symfony AppsSymfony Live NYC 2014 -  Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
Pablo Godel
 
Code review and security audit in private cloud - Arief Karfianto
Code review and security audit in private cloud - Arief KarfiantoCode review and security audit in private cloud - Arief Karfianto
Code review and security audit in private cloud - Arief Karfianto
idsecconf
 
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony AppsSymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
Pablo Godel
 
Unit testing symfony plugins with php unit
Unit testing symfony plugins with php unitUnit testing symfony plugins with php unit
Unit testing symfony plugins with php unit
Christian Schaefer
 
Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009
Fabien Potencier
 
Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...
Niels Frydenholm
 
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Edward Wilde
 
Modern websites in 2020 and Joomla
Modern websites in 2020 and JoomlaModern websites in 2020 and Joomla
Modern websites in 2020 and Joomla
George Wilson
 
Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011
Vincent Partington
 
Lightning Fast SCADA Development with Open Library for WinCC OA
Lightning Fast SCADA Development with Open Library for WinCC OA Lightning Fast SCADA Development with Open Library for WinCC OA
Lightning Fast SCADA Development with Open Library for WinCC OA
DMC, Inc.
 
Steamlining your puppet development workflow
Steamlining your puppet development workflowSteamlining your puppet development workflow
Steamlining your puppet development workflow
Tomas Doran
 
Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet Camp New York 2014: Streamlining Puppet Development Workflow
Puppet
 
Symfony4 - Deep dive
Symfony4 - Deep diveSymfony4 - Deep dive
Symfony4 - Deep dive
Salma Ghareeb
 
Version Control With Subversion
Version Control With SubversionVersion Control With Subversion
Version Control With Subversion
Samnang Chhun
 
Ci for i-os-codemash-01.2013
Ci for i-os-codemash-01.2013Ci for i-os-codemash-01.2013
Ci for i-os-codemash-01.2013
Kevin Munc
 
Hands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkHands-on with the Symfony2 Framework
Hands-on with the Symfony2 Framework
Ryan Weaver
 
Rabbits, indians and... Symfony meets queueing brokers
Rabbits, indians and...  Symfony meets queueing brokersRabbits, indians and...  Symfony meets queueing brokers
Rabbits, indians and... Symfony meets queueing brokers
Gaetano Giunta
 

More from Pablo Godel (20)

DeSymfony 2017 - Symfony en OpenSky
DeSymfony 2017 - Symfony en OpenSkyDeSymfony 2017 - Symfony en OpenSky
DeSymfony 2017 - Symfony en OpenSky
Pablo Godel
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.cat
Pablo Godel
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
Pablo Godel
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer Toolbox
Pablo Godel
 
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
Pablo Godel
 
PHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balas
PHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balasPHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balas
PHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balas
Pablo Godel
 
php[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP apps
php[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP appsphp[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP apps
php[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP apps
Pablo Godel
 
Lone Star PHP 2013 - Sysadmin Skills for PHP Developers
Lone Star PHP 2013 - Sysadmin Skills for PHP DevelopersLone Star PHP 2013 - Sysadmin Skills for PHP Developers
Lone Star PHP 2013 - Sysadmin Skills for PHP Developers
Pablo Godel
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New Angle
Pablo Godel
 
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...
Pablo Godel
 
Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2
Pablo Godel
 
Tek13 - Creating Mobile Apps with PHP and Symfony
Tek13 - Creating Mobile Apps with PHP and SymfonyTek13 - Creating Mobile Apps with PHP and Symfony
Tek13 - Creating Mobile Apps with PHP and Symfony
Pablo Godel
 
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Pablo Godel
 
Soflophp 2013 - SysAdmin skills for PHP developers
Soflophp 2013 - SysAdmin skills for PHP developersSoflophp 2013 - SysAdmin skills for PHP developers
Soflophp 2013 - SysAdmin skills for PHP developers
Pablo Godel
 
Symfony2 and MongoDB - MidwestPHP 2013
Symfony2 and MongoDB - MidwestPHP 2013   Symfony2 and MongoDB - MidwestPHP 2013
Symfony2 and MongoDB - MidwestPHP 2013
Pablo Godel
 
Rock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsRock Solid Deployment of Web Applications
Rock Solid Deployment of Web Applications
Pablo Godel
 
Codeworks'12 Rock Solid Deployment of PHP Apps
Codeworks'12 Rock Solid Deployment of PHP AppsCodeworks'12 Rock Solid Deployment of PHP Apps
Codeworks'12 Rock Solid Deployment of PHP Apps
Pablo Godel
 
PFCongres 2012 - Rock Solid Deployment of PHP Apps
PFCongres 2012 - Rock Solid Deployment of PHP AppsPFCongres 2012 - Rock Solid Deployment of PHP Apps
PFCongres 2012 - Rock Solid Deployment of PHP Apps
Pablo Godel
 
Symfony2 y MongoDB - deSymfony 2012
Symfony2 y MongoDB - deSymfony 2012Symfony2 y MongoDB - deSymfony 2012
Symfony2 y MongoDB - deSymfony 2012
Pablo Godel
 
Declare independence from your it department sysadmin skills for symfony dev...
Declare independence from your it department  sysadmin skills for symfony dev...Declare independence from your it department  sysadmin skills for symfony dev...
Declare independence from your it department sysadmin skills for symfony dev...
Pablo Godel
 
DeSymfony 2017 - Symfony en OpenSky
DeSymfony 2017 - Symfony en OpenSkyDeSymfony 2017 - Symfony en OpenSky
DeSymfony 2017 - Symfony en OpenSky
Pablo Godel
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.cat
Pablo Godel
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
Pablo Godel
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer Toolbox
Pablo Godel
 
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
PHP Conference Argentina 2013 - Independizate de tu departamento IT - Habilid...
Pablo Godel
 
PHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balas
PHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balasPHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balas
PHP Conference Argentina 2013 - Deployment de aplicaciones PHP a prueba de balas
Pablo Godel
 
php[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP apps
php[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP appsphp[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP apps
php[architect] Summit Series DevOps 2013 - Rock solid deployment of PHP apps
Pablo Godel
 
Lone Star PHP 2013 - Sysadmin Skills for PHP Developers
Lone Star PHP 2013 - Sysadmin Skills for PHP DevelopersLone Star PHP 2013 - Sysadmin Skills for PHP Developers
Lone Star PHP 2013 - Sysadmin Skills for PHP Developers
Pablo Godel
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New Angle
Pablo Godel
 
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...
Pablo Godel
 
Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2
Pablo Godel
 
Tek13 - Creating Mobile Apps with PHP and Symfony
Tek13 - Creating Mobile Apps with PHP and SymfonyTek13 - Creating Mobile Apps with PHP and Symfony
Tek13 - Creating Mobile Apps with PHP and Symfony
Pablo Godel
 
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Pablo Godel
 
Soflophp 2013 - SysAdmin skills for PHP developers
Soflophp 2013 - SysAdmin skills for PHP developersSoflophp 2013 - SysAdmin skills for PHP developers
Soflophp 2013 - SysAdmin skills for PHP developers
Pablo Godel
 
Symfony2 and MongoDB - MidwestPHP 2013
Symfony2 and MongoDB - MidwestPHP 2013   Symfony2 and MongoDB - MidwestPHP 2013
Symfony2 and MongoDB - MidwestPHP 2013
Pablo Godel
 
Rock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsRock Solid Deployment of Web Applications
Rock Solid Deployment of Web Applications
Pablo Godel
 
Codeworks'12 Rock Solid Deployment of PHP Apps
Codeworks'12 Rock Solid Deployment of PHP AppsCodeworks'12 Rock Solid Deployment of PHP Apps
Codeworks'12 Rock Solid Deployment of PHP Apps
Pablo Godel
 
PFCongres 2012 - Rock Solid Deployment of PHP Apps
PFCongres 2012 - Rock Solid Deployment of PHP AppsPFCongres 2012 - Rock Solid Deployment of PHP Apps
PFCongres 2012 - Rock Solid Deployment of PHP Apps
Pablo Godel
 
Symfony2 y MongoDB - deSymfony 2012
Symfony2 y MongoDB - deSymfony 2012Symfony2 y MongoDB - deSymfony 2012
Symfony2 y MongoDB - deSymfony 2012
Pablo Godel
 
Declare independence from your it department sysadmin skills for symfony dev...
Declare independence from your it department  sysadmin skills for symfony dev...Declare independence from your it department  sysadmin skills for symfony dev...
Declare independence from your it department sysadmin skills for symfony dev...
Pablo Godel
 

Recently uploaded (20)

IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep DiveDesigning Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
ScyllaDB
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep DiveDesigning Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
ScyllaDB
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 

Symfony Live San Francisco 2017 - Symfony @ OpenSky

  • 3. Symfony @ OpenSky What is OpenSky? • Multiple businesses powered by Symfony: 1. opensky.com 2. dotandbo.com 3. 55mulberry.com
  • 4. Symfony @ OpenSky What is OpenSky? • Multiple businesses powered by Symfony: 1. opensky.com 2. dotandbo.com 3. 55mulberry.com • +100 employees
  • 5. Symfony @ OpenSky What is OpenSky? • Multiple businesses powered by Symfony: 1. opensky.com 2. dotandbo.com 3. 55mulberry.com • +100 employees • Offices all around the world in New York, Portland, Nashville, Miami, Chico, Bucharest and Los Angeles
  • 8. Symfony @ OpenSky • Early adopter of Symfony2 in 2010 before 2.0 stable was released History
  • 9. Symfony @ OpenSky • Early adopter of Symfony2 in 2010 before 2.0 stable was released • Migrated from Magento -> symfony1 -> Symfony2 History
  • 10. Symfony @ OpenSky • Early adopter of Symfony2 in 2010 before 2.0 stable was released • Migrated from Magento -> symfony1 -> Symfony2 • Aspects of Magento cart utilized throughout migration process until completely phased out with proprietary cart/checkout technology History
  • 11. Symfony @ OpenSky THE CURRENT STACK
  • 12. Symfony @ OpenSky • Symfony 2.8 • RequireJS + Backbone • PHP 7.1.10 • MySQL 5.6 + MongoDB 3.2 • Redis • Varnish + Nginx • VMWare • Vagrant + VirtualBox for Dev VMs The Current Stack
  • 13. Symfony @ OpenSky • ~400 Controllers • +800 Routes • ~1,900 Services • 285 Commands • 374 Entities • 467 Documents • 808,532 LoC • 3,738 Classes • 156 Interfaces • 46 Traits • +10,000 Unit Tests The Current Stack
  • 14. Symfony @ OpenSky The Current Stack
  • 15. Symfony @ OpenSky The Current Stack
  • 17. Symfony @ OpenSky Symfony at OpenSky GitHub Enterprise GitHub Enterprise Coding workflow
  • 18. Symfony @ OpenSky • production branch (master) Coding workflow
  • 19. Symfony @ OpenSky • production branch (master) • feature / fix branches Coding workflow
  • 20. Symfony @ OpenSky • production branch (master) • feature / fix branches • Pull Requests linked to JIRA Coding workflow
  • 21. Symfony @ OpenSky • production branch (master) • feature / fix branches • Pull Requests linked to JIRA • Integration with Jenkins for Unit/ Functional Tests Coding workflow
  • 22. Symfony @ OpenSky • production branch (master) • feature / fix branches • Pull Requests linked to JIRA • Integration with Jenkins for Unit/ Functional Tests • Pre-commit Hooks for php-cs-fixer, gulp-jshint, gulp-sass-lint Coding workflow
  • 23. Symfony @ OpenSky • Symfony Coding Standards Coding workflow
  • 24. Symfony @ OpenSky • Symfony Coding Standards • Short Array Syntax Coding workflow
  • 25. Symfony @ OpenSky • Symfony Coding Standards • Short Array Syntax • Ordered Use Statements Coding workflow
  • 26. Symfony @ OpenSky • Symfony Coding Standards • Short Array Syntax • Ordered Use Statements • Ensuring an EOL at end of file Coding workflow
  • 27. Symfony @ OpenSky • PHP7 Type-Hints when possible Coding workflow
  • 28. Symfony @ OpenSky • PHP7 Type-Hints when possible • DocBlocks only when adds clarity Coding workflow
  • 29. Symfony @ OpenSky • PHP7 Type-Hints when possible • DocBlocks only when adds clarity • ClassName::class Coding workflow
  • 30. Symfony @ OpenSky • PHP7 Type-Hints when possible • DocBlocks only when adds clarity • ClassName::class • ‘NamespaceClassName’ Coding workflow
  • 31. Symfony @ OpenSky • PHP7 Type-Hints when possible • DocBlocks only when adds clarity • ClassName::class • ‘NamespaceClassName’ • In forms use class constant Coding workflow
  • 32. Symfony @ OpenSky • PHP7 Type-Hints when possible • DocBlocks only when adds clarity • ClassName::class • ‘NamespaceClassName’ • In forms use class constant • $builder->add('name', TextType::class); Coding workflow
  • 33. Symfony @ OpenSky • PHP7 Type-Hints when possible • DocBlocks only when adds clarity • ClassName::class • ‘NamespaceClassName’ • In forms use class constant • $builder->add('name', TextType::class); • Always use ‘use’ statement • $time = new DateTime() Coding workflow
  • 34. Symfony @ OpenSky Before production deployment: Coding workflow
  • 35. Symfony @ OpenSky Before production deployment: • Peer Reviews using GitHub PRs Coding workflow
  • 36. Symfony @ OpenSky Before production deployment: • Peer Reviews using GitHub PRs • 100% test pass (unit & functional) Coding workflow
  • 37. Symfony @ OpenSky Before production deployment: • Peer Reviews using GitHub PRs • 100% test pass (unit & functional) • Integration deploy/testing Coding workflow
  • 38. Symfony @ OpenSky Before production deployment: • Peer Reviews using GitHub PRs • 100% test pass (unit & functional) • Integration deploy/testing • UA / QA pass (tracked in JIRA) Coding workflow
  • 40. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. Symfony Bundles
  • 41. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. • MainBundle Symfony Bundles
  • 42. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. • MainBundle • AdminBundle (500+ routes, 300 extra services in the container) Symfony Bundles
  • 43. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. • MainBundle • AdminBundle (500+ routes, 300 extra services in the container) • APIBundle Symfony Bundles
  • 44. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. • MainBundle • AdminBundle (500+ routes, 300 extra services in the container) • APIBundle • 3rd Party Bundles Symfony Bundles
  • 45. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. • MainBundle • AdminBundle (500+ routes, 300 extra services in the container) • APIBundle • 3rd Party Bundles • AvalancheImagineBundle Symfony Bundles
  • 46. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. • MainBundle • AdminBundle (500+ routes, 300 extra services in the container) • APIBundle • 3rd Party Bundles • AvalancheImagineBundle • FOSUserBundle Symfony Bundles
  • 47. Symfony @ OpenSky • Split things into broad bundles. Don’t over bundle. • MainBundle • AdminBundle (500+ routes, 300 extra services in the container) • APIBundle • 3rd Party Bundles • AvalancheImagineBundle • FOSUserBundle • Using 3rd party bundles may impact maintainability in the long term Symfony Bundles
  • 49. Symfony @ OpenSky • MongoDB and MySQL together Doctrine
  • 50. Symfony @ OpenSky • MongoDB and MySQL together • References between MongoDB and MySQL Doctrine
  • 51. Symfony @ OpenSky • MongoDB and MySQL together • References between MongoDB and MySQL • Using the Doctrine ORM & MongoDB ODM to make the models for the two databases transparent to the application. Doctrine
  • 52. Symfony @ OpenSky • MongoDB and MySQL together • References between MongoDB and MySQL • Using the Doctrine ORM & MongoDB ODM to make the models for the two databases transparent to the application. • Never delete data due to referential integrity problems. Use soft delete (deletedAt) Doctrine
  • 53. Symfony @ OpenSky • MongoDB and MySQL together • References between MongoDB and MySQL • Using the Doctrine ORM & MongoDB ODM to make the models for the two databases transparent to the application. • Never delete data due to referential integrity problems. Use soft delete (deletedAt) • Traits for common functionality like createdAt/ updatedAt/deletedAt Doctrine
  • 55. Symfony @ OpenSky • How long did it take to run? Doctrine Migrations
  • 56. Symfony @ OpenSky • How long did it take to run? • Is it backwards compatible? Doctrine Migrations
  • 57. Symfony @ OpenSky • How long did it take to run? • Is it backwards compatible? • Up & Down Doctrine Migrations
  • 58. Symfony @ OpenSky • How long did it take to run? • Is it backwards compatible? • Up & Down • schema.sql / data.sql up-to-date Doctrine Migrations
  • 59. Symfony @ OpenSky • How long did it take to run? • Is it backwards compatible? • Up & Down • schema.sql / data.sql up-to-date • Add indexes Doctrine Migrations
  • 60. Symfony @ OpenSky • How long did it take to run? • Is it backwards compatible? • Up & Down • schema.sql / data.sql up-to-date • Add indexes • Remove data later in separate migration Doctrine Migrations
  • 62. Symfony @ OpenSky • Lean Controllers
  • 63. Symfony @ OpenSky • Lean • No Business Logic Controllers
  • 64. Symfony @ OpenSky • Lean • No Business Logic • Only Flow control Controllers
  • 65. Symfony @ OpenSky • Lean • No Business Logic • Only Flow control • Extend Custom BaseController Controllers
  • 66. Symfony @ OpenSky • Two tiers of authentication implemented using role voters. Security
  • 67. Symfony @ OpenSky • Two tiers of authentication implemented using role voters. • PartiallyAuthenticatedVoter Security
  • 68. Symfony @ OpenSky • Two tiers of authentication implemented using role voters. • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter Security
  • 69. Symfony @ OpenSky • Two tiers of authentication implemented using role voters. • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter • When a user is recently authenticated, they are logged in to 2nd tier of authentication and have access to account, checkout, etc. After 15 minutes of inactivity, user is logged out of 2nd tier. Security
  • 70. Symfony @ OpenSky • Two tiers of authentication implemented using role voters. • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter • When a user is recently authenticated, they are logged in to 2nd tier of authentication and have access to account, checkout, etc. After 15 minutes of inactivity, user is logged out of 2nd tier. • Admin integrates with LDAP (using zendframework/ zend-ldap) Security
  • 71. Symfony @ OpenSky • Two tiers of authentication implemented using role voters. • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter • When a user is recently authenticated, they are logged in to 2nd tier of authentication and have access to account, checkout, etc. After 15 minutes of inactivity, user is logged out of 2nd tier. • Admin integrates with LDAP (using zendframework/ zend-ldap) • Multiple firewalls/authentication providers for consumer facing, admin and api. Security
  • 72. Symfony @ OpenSky Runtime Settings/Parameters • Parameters defined in config/parameters.yml
  • 73. Symfony @ OpenSky • Parameters defined in config/parameters.yml • Override stored in MongoDB Runtime Settings/Parameters
  • 74. Symfony @ OpenSky • Parameters defined in config/parameters.yml • Override stored in MongoDB • Parameters can have start & end datetime Runtime Settings/Parameters
  • 75. Symfony @ OpenSky • Parameters defined in config/parameters.yml • Override stored in MongoDB • Parameters can have start & end datetime • All parameters stored in cache Runtime Settings/Parameters
  • 76. Symfony @ OpenSky • Parameters defined in config/parameters.yml • Override stored in MongoDB • Parameters can have start & end datetime • All parameters stored in cache • When parameter value is changed, cache is updated and queue workers restarted Runtime Settings/Parameters
  • 77. Symfony @ OpenSky • Parameters defined in config/parameters.yml • Override stored in MongoDB • Parameters can have start & end datetime • All parameters stored in cache • When parameter value is changed, cache is updated and queue workers restarted • Allows for configuration changes without deployment Runtime Settings/Parameters
  • 78. Symfony @ OpenSky • Parameters defined in config/parameters.yml • Override stored in MongoDB • Parameters can have start & end datetime • All parameters stored in cache • When parameter value is changed, cache is updated and queue workers restarted • Allows for configuration changes without deployment • Heavily used for feature flags and enable/ disable of new features Runtime Settings/Parameters
  • 79. Symfony @ OpenSky Runtime Settings/Parameters
  • 80. Symfony @ OpenSky Runtime Settings/Parameters
  • 81. Symfony @ OpenSky Runtime Settings/Parameters
  • 83. Symfony @ OpenSky • Perform tasks after the response has been sent to client Event kernel.terminate
  • 84. Symfony @ OpenSky • Perform tasks after the response has been sent to client • Store Request Log in MongoDB Collection Event kernel.terminate
  • 85. Symfony @ OpenSky • Perform tasks after the response has been sent to client • Store Request Log in MongoDB Collection • Analyze request for further actions Event kernel.terminate
  • 86. Symfony @ OpenSky • Perform tasks after the response has been sent to client • Store Request Log in MongoDB Collection • Analyze request for further actions • Only effective with FastCGI Event kernel.terminate
  • 87. Symfony @ OpenSky • Queueing events for async functionality Events system
  • 88. Symfony @ OpenSky • Queueing events for async functionality • Event serializer/unserializer Events system
  • 89. Symfony @ OpenSky • Queueing events for async functionality • Event serializer/unserializer • Scheduling events Events system
  • 90. Symfony @ OpenSky • Queueing events for async functionality • Event serializer/unserializer • Scheduling events • Event retries, retry max amount Events system
  • 91. Symfony @ OpenSky • Queueing events for async functionality • Event serializer/unserializer • Scheduling events • Event retries, retry max amount • One queue per mongodb collection Events system
  • 92. Symfony @ OpenSky • Queueing events for async functionality • Event serializer/unserializer • Scheduling events • Event retries, retry max amount • One queue per mongodb collection • Queue workers managed with Supervisord Events system
  • 99. Symfony @ OpenSky • php-kip using yabot Slack integration
  • 100. Symfony @ OpenSky • php-kip using yabot • Production deploy queue/line Slack integration
  • 101. Symfony @ OpenSky • php-kip using yabot • Production deploy queue/line • Dev environment reservations & deploys Slack integration
  • 102. Symfony @ OpenSky Symfony at OpenSky Php-kip using yubot - Production deploy queue/line - Dev environment deploys Slack integration
  • 103. Symfony @ OpenSky Symfony at OpenSky Php-kip using yubot - Production deploy queue/line - Dev environment deploys Slack integration
  • 104. Symfony @ OpenSky Symfony at OpenSky Php-kip using yubot - Production deploy queue/line - Dev environment deploys Slack integration
  • 105. Symfony @ OpenSky Slack integration
  • 106. Symfony @ OpenSky Slack integration
  • 107. Symfony @ OpenSky Slack integration
  • 109. Symfony @ OpenSky Search • Integration with Algolia
  • 110. Symfony @ OpenSky • Integration with Algolia • algolia/algoliasearch-client-php Search
  • 111. Symfony @ OpenSky • Integration with Algolia • algolia/algoliasearch-client-php • Update index through async Event Listeners Search
  • 112. Symfony @ OpenSky Payments • Integration with Braintree Payments • braintree/braintree_php
  • 113. Symfony @ OpenSky • NPM • jQuery • RequireJS • Backbone • TwigJS • Gulp / Less / Sass The Frontend
  • 114. Symfony @ OpenSky • A/B Split Testing using Optimizely for testing UI/UX changes • Send small % of traffic to new features • GoogleAnalytics tracking conversion rate The Frontend
  • 116. Symfony @ OpenSky • pr-nightmare Testing
  • 117. Symfony @ OpenSky • pr-nightmare • Runs on all commits and pull requests Testing
  • 118. Symfony @ OpenSky • pr-nightmare • Runs on all commits and pull requests • Uses PHPChunkit to run 30 minutes of tests in 3 minutes by running groups of tests in parallel across multiple servers. 
 https://github.com/jwage/phpchunkit Testing
  • 119. Symfony @ OpenSky • pr-nightmare • Runs on all commits and pull requests • Uses PHPChunkit to run 30 minutes of tests in 3 minutes by running groups of tests in parallel across multiple servers. 
 https://github.com/jwage/phpchunkit • Selenium for browser functional testing Testing
  • 121. Symfony @ OpenSky • ‘@app admin’ annotation to indicate web test cases which app/kernel to boot up Testing with PHPUnit
  • 122. Symfony @ OpenSky • ‘@app admin’ annotation to indicate web test cases which app/kernel to boot up • AutoDataCleanupListener keeps tracks of what collections and tables were inserted to in a test and cleans up afterwards. This used to be explicitly required by the developer but happens automatically now Testing with PHPUnit
  • 123. Symfony @ OpenSky • ‘@app admin’ annotation to indicate web test cases which app/kernel to boot up • AutoDataCleanupListener keeps tracks of what collections and tables were inserted to in a test and cleans up afterwards. This used to be explicitly required by the developer but happens automatically now • AbstractTwigLintTest: Twig linting. Loads up all twig files to make sure there are no parse errors Testing with PHPUnit
  • 124. Symfony @ OpenSky • ‘@app admin’ annotation to indicate web test cases which app/kernel to boot up • AutoDataCleanupListener keeps tracks of what collections and tables were inserted to in a test and cleans up afterwards. This used to be explicitly required by the developer but happens automatically now • AbstractTwigLintTest: Twig linting. Loads up all twig files to make sure there are no parse errors • Generating unit tests from class definitions Testing with PHPUnit
  • 125. Symfony @ OpenSky • ‘@app admin’ annotation to indicate web test cases which app/kernel to boot up • AutoDataCleanupListener keeps tracks of what collections and tables were inserted to in a test and cleans up afterwards. This used to be explicitly required by the developer but happens automatically now • AbstractTwigLintTest: Twig linting. Loads up all twig files to make sure there are no parse errors • Generating unit tests from class definitions • PHPUnit watch command Testing with PHPUnit
  • 126. Symfony @ OpenSky Testing with PHPUnit
  • 127. Symfony @ OpenSky Testing with PHPUnit
  • 132. Symfony @ OpenSky Twig Lint with PHPUnit
  • 133. Symfony @ OpenSky Twig Lint with PHPUnit
  • 134. Symfony @ OpenSky Twig Lint with PHPUnit
  • 136. Symfony @ OpenSky Deployment • Use Customized Fabric • Manually started from Jenkins • First build task • Merge feature/fix branch into master • Create Tag
  • 137. Symfony @ OpenSky • Final build task • git checkout • composer install --no-dev —no-scripts • Build front controller • Run gulp, requires, less, sass • Warmup cache for each app • Assetic dump • Build artifacts file & distribute it to servers • Run MySQL & MongoDB Migrations • Rotate logs • Restart php-fpm • Reload Varnish and nginx • Restart queue workers Deployment • Use Customized Fabric • Manually started from Jenkins • First build task • Merge feature/fix branch into master • Create Tag
  • 139. Symfony @ OpenSky Thank you! Pablo Godel @pgodel http://slideshare.net/pgodel https://joind.in/talk/bfd1e