Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Symfony3 Best Practices from the trenches
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Stefan Koopmanschap
May 24, 2016
Technology
1
220
Symfony3 Best Practices from the trenches
As done at PHP.FRL meetup in Heerenveen
Stefan Koopmanschap
May 24, 2016
Tweet
Share
More Decks by Stefan Koopmanschap
See All by Stefan Koopmanschap
How to make good decisions with a happy team (SymfonyCon 2025)
skoop
0
66
PHP Kitchen Nightmares (PHP.FRL)
skoop
0
79
Sustainable open source contributions in your business (CakeFest 2024)
skoop
0
100
Domain-Driven Design: The Basics (SymfonyCon 2023, Brussels)
skoop
0
230
Domain-Driven Design: The Basics (Cakefest)
skoop
0
240
PHP Kitchen Nightmares
skoop
0
73
Domain Driven Design - The Basics (TechTuesday XXL, Tilburg)
skoop
0
110
7 Lessons You Can Learn From Disney Movies (SymfonyCon 2022)
skoop
0
290
Mental Health in the Workplace (SymfonyCon 2019, Amsterdam)
skoop
0
720
Other Decks in Technology
See All in Technology
AWS DevOps Agent vs SRE俺 / AWS DevOps Agent vs me, the SRE
sms_tech
3
550
Kubernetesにおける推論基盤
ry
1
310
聲の形にみるアクセシビリティ
tomokusaba
0
170
猫でもわかるKiro CLI(AI 駆動開発への道編)
kentapapa
0
130
The_Evolution_of_Bits_AI_SRE.pdf
nulabinc
PRO
0
140
情シスのための生成AI実践ガイド2026 / Generative AI Practical Guide for Business Technology 2026
glidenote
0
200
Abuse report だけじゃない。AWS から緊急連絡が来る状況とは?昨今の攻撃や被害の事例の紹介と備えておきたい考え方について
kazzpapa3
1
520
AI時代のSaaSとETL
shoe116
1
110
JAWS DAYS 2026 楽しく学ぼう!ストレージ 入門
yoshiki0705
2
160
Oracle Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
4
1.2k
SRE NEXT 2026 CfP レビュアーが語る聞きたくなるプロポーザルとは?
yutakawasaki0911
1
250
When an innocent-looking ListOffsets Call Took Down Our Kafka Cluster
lycorptech_jp
PRO
0
120
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Cult of Friendly URLs
andyhume
79
6.8k
Accessibility Awareness
sabderemane
0
77
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
140
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
170
How Software Deployment tools have changed in the past 20 years
geshan
0
32k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
300
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
150
Exploring anti-patterns in Rails
aemeredith
2
290
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.8k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Transcript
None
About me » PHPBenelux » PFZ » PHPAmersfoort/PHP.FRL » Ingewikkeld
» phpBB, Zend Framework, Symfony and many more
Once upon a time...
None
Dependency Injection
Dependency Injection » No hardcoded dependencies » Easily manage and
update specific classes » Program to contracts, not implementations » Minimize bootstrap code » More testable code
Dependency Injection class Foo { public function bar() { $coffee
= new Coffee(); $coffee->init(); return $coffee->drink(); } }
Dependency Injection $coffee = new Coffee();
Dependency Injection $coffee->init();
Dependency Injection class Coffee implements Roastable {} class Foo {
private $coffee; public function __construct(Roastable $coffee) { $this->coffee = $coffee; } }
Dependency Injection public function bar() { return $this->coffee->drink(); }
Dependency Injection parameters: coffee.class: "Coffee" foo.class: "Foo" services: coffee: class:
"%coffee.class%" foo: class: "%foo.class%" arguments: - "@coffee"
Dependency Injection class DefaultController { public function fooAction() { $foo
= $this->container->get('foo'); $foo->bar(); } }
Dependency Injection class DefaultController { private $foo; public function __construct(Foo
$foo) { $this->foo = $foo; } public function fooAction() { $this->foo->bar(); } }
Service layer Or: How Symfony is only implementation
Service layer » Seperation of concerns » Business logic should
not be bound to the application » Service layer can be accessed through the service container
Service layer public function showAction($productId) { $product = $this->getDoctrine() ->getRepository('AppBundle:Product')
->find($productId); if (!$product) { throw $this->createNotFoundException( 'No product found for id '.$productId ); } // ... do something, like pass the $product object into a template }
None
None
Service Layer Hexagonal architecture » http://php-and-symfony.matthiasnoback.nl/tags/ hexagonal%20architecture/ » http://protalk.me/the-framework-as-an- implementation-detail
None
Documentation
Documentation » The best starting point for your search »
Not the ultimate source for information
Documentation » Google » Stack Overflow » Blogs » IRC
Documentation » Something missing? Add it yourself! » https://github.com/symfony/symfony-docs
Documentation » Symfony Rainbow Series by Joshua Thijssen » https://leanpub.com/b/symfonyrainbowseries
Project Configuration
Project Configuration Everything in its right place » config*.yml »
routing*.yml » security.yml » parameters.yml
None
Project Configuration XML vs yaml » http://gowat.ch/xmlyml » http://converter.rosstuck.com/
Choose and Standardize
Choose » You can do things in multiple ways »
THIS IS GREAT! » Clarity, readability, maintainability
Standardize » Configuration: yml, xml, annotations » Controller extends or
not? » Naming of services, parameters, bundles
Ready for action?
Ready for action? » Use bundles correctly » Maximize external
library usage » Avoid |raw » .gitignore your parameters.yml » Translate! » Log all the things! » Stay up-to-date
Up-to-date » 2.7 - support until 05/2018, EOL 05/2019 »
2.8 - support until 11/2018, EOL 11/2019 » 3.0 - support until 07/2016, EOL 01/2017 » Next LTS: 3.4: support until 11/2020, EOL 11/2021
Questions?
I Salute You
I Salute You @skoop leftontheweb.com php.ingewikkeld.net