Slide 1

Slide 1 text

F R O M T H E T R E N C H E S S Y M F O N Y 2 B E S T P R A C T I C E S

Slide 2

Slide 2 text

S T E FA N K O O P M A N S C H A P • PHPBenelux • PFZ • Ingewikkeld • phpBB, Zend Framework, Symfony2, joind.in, protalk, etc

Slide 3

Slide 3 text

TRYING TO PLAY http://joind.in/12064

Slide 4

Slide 4 text

O U R T O P I C S F O R T O D AY • Dependency Injection • Service Layer • The Symfony2 Documentation • Project Configuration • Service Configuration

Slide 5

Slide 5 text

O U R T O P I C S F O R T O D AY • Choose and standardise • Composer • What else?

Slide 6

Slide 6 text

O N C E U P O N A T I M E …

Slide 7

Slide 7 text

O N C E U P O N A T I M E …

Slide 8

Slide 8 text

D E P E N D E N C Y I N J E C T I O N

Slide 9

Slide 9 text

D E P E N D E N C Y I N J E C T I O N • No hardcoded dependencies • Easily manage and update specific classes • Minimize bootstrap code • More testable code

Slide 10

Slide 10 text

D E P E N D E N C Y I N J E C T I O N class Foo { public function bar() { $coffee = new Coffee(); $coffee->init(); return $coffee->drink(); } }

Slide 11

Slide 11 text

D E P E N D E N C Y I N J E C T I O N class Foo { public function bar() { $coffee = new Coffee(); $coffee->init(); return $coffee->drink(); } }

Slide 12

Slide 12 text

D E P E N D E N C Y I N J E C T I O N class Foo { public function bar() { $coffee = new Coffee(); $coffee->init(); return $coffee->drink(); } }

Slide 13

Slide 13 text

D E P E N D E N C Y I N J E C T I O N class Foo { public function bar() { $coffee = new Coffee(); $coffee->init(); return $coffee->drink(); } }

Slide 14

Slide 14 text

D E P E N D E N C Y I N J E C T I O N class Coffee implements Roastable {} class Foo { private $coffee; public function __construct(Roastable $coffee) { $this->coffee = $coffee; } }

Slide 15

Slide 15 text

D E P E N D E N C Y I N J E C T I O N class Foo { private $coffee; public function bar() { return $this->coffee->drink(); } }

Slide 16

Slide 16 text

D E P E N D E N C Y I N J E C T I O N ! Coffee Foo ! ! !

Slide 17

Slide 17 text

D E P E N D E N C Y I N J E C T I O N class DefaultController extends ApiControllerAbstract { public function fooController() { $foo = $this->get('foo'); $foo->bar(); } }

Slide 18

Slide 18 text

S E R V I C E L AY E R

Slide 19

Slide 19 text

S E R V I C E L AY E R • Abstract data store from business logic • Seperation of concerns • Easy access via service container

Slide 20

Slide 20 text

S E R V I C E L AY E R • Abstract data store from business logic • Seperation of concerns • Easy access via service container

Slide 21

Slide 21 text

S E R V I C E L AY E R C O N T R O L L E R S E R V I C E L AY E R P E R S I S T E N C Y L AY E R

Slide 22

Slide 22 text

S E R V I C E L AY E R Take it even further: ! http://protalk.me/the-framework-as-an- implementation-detail

Slide 23

Slide 23 text

T H E S Y M F O N Y 2 D O C U M E N TAT I O N

Slide 24

Slide 24 text

T H E S Y M F O N Y 2 D O C U M E N TAT I O N • The best starting point for your search • Not the ultimate source for information

Slide 25

Slide 25 text

T H E S Y M F O N Y 2 D O C U M E N TAT I O N • Google • Stack Overflow • Blogs • IRC

Slide 26

Slide 26 text

T H E S Y M F O N Y 2 D O C U M E N TAT I O N • Something missing? Add it yourself! • https://github.com/symfony/symfony-docs

Slide 27

Slide 27 text

T H E S Y M F O N Y 2 D O C U M E N TAT I O N

Slide 28

Slide 28 text

P R O J E C T C O N F I G U R AT I O N

Slide 29

Slide 29 text

P R O J E C T C O N F I G U R AT I O N • Everything in it’s right place • config*.yml • routing*.yml • security.yml • parameters.yml

Slide 30

Slide 30 text

S E R V I C E C O N F I G U R AT I O N

Slide 31

Slide 31 text

S E R V I C E C O N F I G U R AT I O N • Yaml vs XML • Little detail: http://gowat.ch/xmlyml • http://converter.rosstuck.com/

Slide 32

Slide 32 text

C H O O S E A N D S TA N D A R D I S E

Slide 33

Slide 33 text

C H O O S E A N D S TA N D A R D I S E • You can do things in multiple ways • THIS IS GREAT! • Clarity, readability, maintainability

Slide 34

Slide 34 text

C H O O S E A N D S TA N D A R D I S E • Configuration: yml, xml, annotations • Controller extends or not? • Naming of services and parameters

Slide 35

Slide 35 text

C O M P O S E R

Slide 36

Slide 36 text

C O M P O S E R ALWAYS USE COMPOSER

Slide 37

Slide 37 text

C O M P O S E R • Commit composer.json and composer.lock • Run composer update • Switch branch: composer install • Lock packages to version as much as possible • Lock packages to version as detailed as possible

Slide 38

Slide 38 text

C O M P O S E R THERE IS DRUSH INTEGRATION

Slide 39

Slide 39 text

C O M P O S E R ALWAYS USE COMPOSER

Slide 40

Slide 40 text

R E A D Y F O R A C T I O N ?

Slide 41

Slide 41 text

R E A D Y F O R A C T I O N ? • Forms: Always use the form component • Use bundles correctly • Maximize external bundle usage • PSR-0 • Avoid |raw

Slide 42

Slide 42 text

R E A D Y F O R A C T I O N ? • Change the session directory • Change the log directory • .gitignore your parameters.yml • Translate! • Use components if you don’t do full-stack

Slide 43

Slide 43 text

Q U E S T I O N S ?

Slide 44

Slide 44 text

I S A L U T E Y O U

Slide 45

Slide 45 text

I S A L U T E Y O U leftontheweb.com php.ingewikkeld.net ! joind.in/12064 @skoop