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