Symfony2 best practices from the trenches (ZendCon 2016)

Symfony2 best practices from the trenches (ZendCon 2016)

Symfony2 is a great framework and getting your first application up is easy. The documentation of Symfony2 is good but there's only so much that documentation can teach you. Many details and best practices are best learned while you're working on your project. During this talk, you'll be bombarded with those small pieces of knowledge and experience learned from the trenches of actual Symfony2 projects, where developers had to dodge those bullets Matrix-style. Whether it's about that little configuration detail you always forget or a good way of abstracting logic into the right pieces, we'll cover it all.

A8f72e32766355f12a56ede9aaa0ee78?s=128

Stefan Koopmanschap

October 20, 2016
Tweet

Transcript

  1. 1.
  2. 2.

    ABOUT ME > PHPBenelux > PFZ > PHPAmersfoort/PHP.FRL > Ingewikkeld

    > phpBB, Zend Framework, Symfony and many more
  3. 5.
  4. 7.

    DEPENDENCY INJECTION > No hardcoded dependencies > Easily manage and

    update specific classes > Program to contracts, not implementations > Minimize bootstrap code > More testable code
  5. 8.

    DEPENDENCY INJECTION class Foo { public function bar() { $coffee

    = new Coffee(); $coffee->init(); return $coffee->drink(); } }
  6. 11.

    DEPENDENCY INJECTION class Coffee implements Roastable {} class Foo {

    private $coffee; public function __construct(Roastable $coffee) { $this->coffee = $coffee; } }
  7. 13.

    DEPENDENCY INJECTION parameters: coffee.class: "Coffee" foo.class: "Foo" services: coffee: class:

    "%coffee.class%" foo: class: "%foo.class%" arguments: - "@coffee"
  8. 14.
  9. 15.

    DEPENDENCY INJECTION class DefaultController { private $foo; public function __construct(Foo

    $foo) { $this->foo = $foo; } public function fooAction() { $this->foo->bar(); } }
  10. 17.

    SERVICE LAYER > Seperation of concerns > Business logic should

    not be bound to the application > Service layer can be accessed through the service container
  11. 18.

    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 }
  12. 19.
  13. 20.
  14. 22.
  15. 24.

    DOCUMENTATION > The best starting point for your search >

    Not the ultimate source for information
  16. 29.

    PROJECT CONFIGURATION EVERYTHING IN ITS RIGHT PLACE > config*.yml >

    routing*.yml > security.yml > parameters.yml
  17. 30.
  18. 33.

    CHOOSE > You can do things in multiple ways >

    THIS IS GREAT! > Clarity, readability, maintainability
  19. 34.
  20. 37.

    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
  21. 38.

    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 > 3.1 - support until 01/2017, EOL 07/2017 > 3.2 - support until 07/2017, EOL 01/2018 > Next LTS: 3.4: support until 11/2020, EOL 11/2021