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
Best Practices in Symfony2
Search
Andreas Hucks
October 09, 2013
Programming
15
1.7k
Best Practices in Symfony2
Andreas Hucks
October 09, 2013
Tweet
Share
More Decks by Andreas Hucks
See All by Andreas Hucks
Divide and Conquer (LonghornPHP 2019)
meandmymonkey
0
120
Symfony Internals
meandmymonkey
3
770
Divide and Conquer
meandmymonkey
1
630
Deptrac - Keep Your Architecture Clean
meandmymonkey
0
620
Introduction to Docker at PHPBenelux2015
meandmymonkey
3
800
Best Practices in Symfony2
meandmymonkey
0
360
Introduction to Docker at PHPNW2014
meandmymonkey
4
390
O(ops), Authentication!
meandmymonkey
4
800
Best Practices in Symfony2
meandmymonkey
28
4.5k
Other Decks in Programming
See All in Programming
SwiftUI Viewの責務分離
elmetal
PRO
1
230
Formの複雑さに立ち向かう
bmthd
1
830
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
130
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
160
Compose でデザインと実装の差異を減らすための取り組み
oidy
1
300
時計仕掛けのCompose
mkeeda
1
290
CNCF Project の作者が考えている OSS の運営
utam0k
6
710
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
36
14k
『品質』という言葉が嫌いな理由
korimu
0
160
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
890
ASP. NET CoreにおけるWebAPIの最新情報
tomokusaba
0
370
Honoとフロントエンドの 型安全性について
yodaka
6
830
Featured
See All Featured
Done Done
chrislema
182
16k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.4k
Optimizing for Happiness
mojombo
376
70k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
The Language of Interfaces
destraynor
156
24k
Adopting Sorbet at Scale
ufuk
74
9.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
410
Unsuck your backbone
ammeep
669
57k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
Building Adaptive Systems
keathley
40
2.4k
Transcript
Best Practices in Symfony2 phpnw 2013 Manchester, Oct. 6th Andreas
Hucks Sonntag, 6. Oktober 13
@meandmymonkey Andreas Hucks Trainer & Consultant at Sonntag, 6. Oktober
13
Best Practices Sonntag, 6. Oktober 13
Bad Practices Sonntag, 6. Oktober 13
symfony Day 2009 Sonntag, 6. Oktober 13
Chapter One A Clean Project Sonntag, 6. Oktober 13
Naming Things in Symphony • Follow PSR-0, PSR-1, PSR-2 •
Find a common scheme for your team • Be explicit • Be consistent Sonntag, 6. Oktober 13
Care about your coding style • Again - follow PSR-0,
PSR-1, PSR-2 • Use PHPCSFixer http://goo.gl/tEK4y Sonntag, 6. Oktober 13
.gitignore /web/bundles/ /app/bootstrap.php.cache /app/cache/* /app/config/parameters.yml /app/logs/* /build/ /vendor/ /bin/ /composer.phar
/data/uploads .idea add your own Sonntag, 6. Oktober 13
.gitignore /web/bundles/ /app/bootstrap.php.cache /app/cache/* /app/config/parameters.yml /app/logs/* /build/ /vendor/ /bin/ /composer.phar
/data/uploads .idea should be in your global .gitignore Sonntag, 6. Oktober 13
.gitignore /web/bundles/ /app/bootstrap.php.cache /app/cache/* /app/config/parameters.yml /app/logs/* /build/ /vendor/ /bin/ /composer.phar
/data/uploads .idea probably this too Sonntag, 6. Oktober 13
.gitignore /web/bundles/ /app/bootstrap.php.cache /app/cache/* /app/config/parameters.yml /app/logs/* /build/ /vendor/ /bin/ /composer.phar
/data/uploads .idea this. Sonntag, 6. Oktober 13
Committing parameters.yml is a Three Kitten Offense Sonntag, 6. Oktober
13
Committing parameters.yml is a Three Kitten Offense Sonntag, 6. Oktober
13
Remove Acme\* Sonntag, 6. Oktober 13
Bundle Naming... Vendor\AwesomeBundle vs. Vendor\Bundle\AwesomeBundle Sonntag, 6. Oktober 13
Bundle Naming... Vendor\AwesomeBundle vs. Vendor\Bundle\AwesomeBundle Sonntag, 6. Oktober 13
FAIL a.k.a. „because I can“ • MyCompleteAppBundle (ok for small
projects) • MyAppNeedingGlobalResourcesBundle • MyBundleInsideAnotherBundleBundle Sonntag, 6. Oktober 13
What should go into a Bundle • Bundles should be
self-contained • Sets of Features • Examples: Forum, AdminPanel... • Configured in /app/config Sonntag, 6. Oktober 13
Your config options • YAML • XML • Annotations •
INI • PHP Sonntag, 6. Oktober 13
Your config options • YAML • XML • Annotations •
INI • PHP meh. Sonntag, 6. Oktober 13
Your config options • YAML • XML • Annotations •
INI • PHP special use cases Sonntag, 6. Oktober 13
Your config options • YAML • XML • Annotations •
INI • PHP not for everything Sonntag, 6. Oktober 13
Your config options • YAML • XML • Annotations •
INI • PHP Routing, Bundle Config, Parameters Services Validators, ORM/ODM Sonntag, 6. Oktober 13
Nest your routing files Sonntag, 6. Oktober 13
Chapter Two Controllers Sonntag, 6. Oktober 13
• Put Controllers on a Diet • Decouple them Sonntag,
6. Oktober 13
Try to lose the Boilerplate Sonntag, 6. Oktober 13
@Template([name]) Sonntag, 6. Oktober 13
@Cache(...) Sonntag, 6. Oktober 13
Inject the Request into Controllers Sonntag, 6. Oktober 13
New in 2.3: handleRequest() Sonntag, 6. Oktober 13
Events for add-on actions Sonntag, 6. Oktober 13
Service Layers Sonntag, 6. Oktober 13
Service Layers Sonntag, 6. Oktober 13
Using the BaseController? Wrap calls to the Container Sonntag, 6.
Oktober 13
Chapter Three Dependency Injection Sonntag, 6. Oktober 13
Injecting the Container Sonntag, 6. Oktober 13
Injecting the Container Sonntag, 6. Oktober 13
But... but Symfony is doing it! Sonntag, 6. Oktober 13
...\TwigBundle\Extension\AssetsExtension Sonntag, 6. Oktober 13
It‘s because of Scopes! Sonntag, 6. Oktober 13
Solution: Synchronized Services (>= 2.3) Sonntag, 6. Oktober 13
Alternative: Providing the Request (< 2.3) Sonntag, 6. Oktober 13
Alternative: Providing the Request (< 2.3) Sonntag, 6. Oktober 13
Service Organization Sonntag, 6. Oktober 13
Split up Service Definitions Sonntag, 6. Oktober 13
Dynamic Loading of Service Definitions Sonntag, 6. Oktober 13
Use Semantic Configuration! Sonntag, 6. Oktober 13
The Container as a Registry Sonntag, 6. Oktober 13
The Container as a Registry Sonntag, 6. Oktober 13
Instead: Proper Service Configuration Sonntag, 6. Oktober 13
Binding to the Environment Sonntag, 6. Oktober 13
Binding to the Environment Sonntag, 6. Oktober 13
Instead: Use Your config files Sonntag, 6. Oktober 13
Miscellaneous • Use XML for Service Definitions • Remember you
can use Environment Variables (Apache, Nginx, ...) • Use %kernel.root_dir% as a reference Sonntag, 6. Oktober 13
Intermezzo Random Tips Sonntag, 6. Oktober 13
PHP • Use 5.4/5.5, it‘s faster • Use APC (or
one of the alternatives) Sonntag, 6. Oktober 13
Composer • Use the --optimize-autoloader option Sonntag, 6. Oktober 13
Doctrine • Activate Metadata Cache • Activate Query Cache •
Use factory-service to register Repositories & ObjectManagers as Services • Do NOT inject the EntityManager into your entities Sonntag, 6. Oktober 13
Security • Make sure there are no leaks in the
security.yml access_control section! • Better: Check Authorization in Controller, possibly use JMSSecurityExtraBundle Sonntag, 6. Oktober 13
Translation • Work with translation keys instead of full text
to avoid breaking translations Sonntag, 6. Oktober 13
Searching • Look for „Symfony2“ (without the space) Sonntag, 6.
Oktober 13
Read the Documentation (and the Changelogs) Sonntag, 6. Oktober 13
Chapter Four Forms Sonntag, 6. Oktober 13
Forms in Controllers Sonntag, 6. Oktober 13
Forms in Controllers Sonntag, 6. Oktober 13
• Couples Form setup to Controller • No reusability Sonntag,
6. Oktober 13
Better: Use Type Classes Sonntag, 6. Oktober 13
Always set the data_class Sonntag, 6. Oktober 13
Using Data in Constructors Sonntag, 6. Oktober 13
Using Data in Constructors Sonntag, 6. Oktober 13
Use Form Events for Related Data Sonntag, 6. Oktober 13
Define Types as Services Sonntag, 6. Oktober 13
Define Types as Services Sonntag, 6. Oktober 13
Don‘t disable CSRF Sonntag, 6. Oktober 13
Don‘t disable CSRF Sonntag, 6. Oktober 13
Thanks! Questions? Please give feedback: http://goo.gl/yK97XK Sonntag, 6. Oktober 13