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
Stefan Koopmanschap
May 24, 2016
Technology
1
190
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
Sustainable open source contributions in your business (CakeFest 2024)
skoop
0
38
Domain-Driven Design: The Basics (SymfonyCon 2023, Brussels)
skoop
0
170
Domain-Driven Design: The Basics (Cakefest)
skoop
0
130
PHP Kitchen Nightmares
skoop
0
29
Domain Driven Design - The Basics (TechTuesday XXL, Tilburg)
skoop
0
83
7 Lessons You Can Learn From Disney Movies (SymfonyCon 2022)
skoop
0
240
Mental Health in the Workplace (SymfonyCon 2019, Amsterdam)
skoop
0
620
Mental Health in the Workplace (PHPugle)
skoop
0
57
Mental Health in the Workplace (DeventerPHP)
skoop
0
110
Other Decks in Technology
See All in Technology
四国クラウドお遍路 2024 in 高知 オープニング
yukataoka
0
130
#Zenoh 完全に理解した 〜組込み純情篇〜
takasehideki
1
460
OCI コスト管理
ocise
1
150
ことばをそろえる / Bridging the Terminology Gap
amaotone
5
1k
20分で分かるIAM全機能 (拡大版) / 20240903-jawsug-yokohama-iam
opelab
3
130
目標設定と習慣化で今よりも一歩生産性を上げる
sansantech
PRO
7
2.4k
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
0
130
Our Journey from in-House CD System to Open Source
ffjlabo
0
110
AWS SAW を広めたい @四国クラウドお遍路
kazzpapa3
0
170
SORACOMで実現するIoTのマルチクラウド対応 - IoTでのクリーンアーキテクチャの実現 -
kenichirokimura
0
260
中規模・ミドルTier開発組織におけるDevRelの戦略と実行と成果 - DevRel Guild Conference Mini -
leveragestech
2
280
SHIFTの課題と目指したい組織像 / 20240827 Rinto Ikenoue
shift_evolve
0
150
Featured
See All Featured
Debugging Ruby Performance
tmm1
72
12k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
52k
Building Applications with DynamoDB
mza
89
5.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
25
1.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
248
20k
Bash Introduction
62gerente
608
210k
Imperfection Machines: The Place of Print at Facebook
scottboms
263
13k
Web development in the modern age
philhawksworth
204
10k
The Cost Of JavaScript in 2023
addyosmani
40
5.2k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
27
7.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
46
48k
Designing Experiences People Love
moore
138
23k
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