Save 37% off PRO during our Black Friday Sale! »

Best Practices in Symfony2

Best Practices in Symfony2

E9612cd342dbddff6640b99db21deee7?s=128

Andreas Hucks

October 09, 2013
Tweet

Transcript

  1. Best Practices in Symfony2 phpnw 2013 Manchester, Oct. 6th Andreas

    Hucks Sonntag, 6. Oktober 13
  2. @meandmymonkey Andreas Hucks Trainer & Consultant at Sonntag, 6. Oktober

    13
  3. Best Practices Sonntag, 6. Oktober 13

  4. Bad Practices Sonntag, 6. Oktober 13

  5. symfony Day 2009 Sonntag, 6. Oktober 13

  6. Chapter One A Clean Project Sonntag, 6. Oktober 13

  7. 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
  8. Care about your coding style • Again - follow PSR-0,

    PSR-1, PSR-2 • Use PHPCSFixer http://goo.gl/tEK4y Sonntag, 6. Oktober 13
  9. .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
  10. .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
  11. .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
  12. .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
  13. Committing parameters.yml is a Three Kitten Offense Sonntag, 6. Oktober

    13
  14. Committing parameters.yml is a Three Kitten Offense Sonntag, 6. Oktober

    13
  15. Remove Acme\* Sonntag, 6. Oktober 13

  16. Bundle Naming... Vendor\AwesomeBundle vs. Vendor\Bundle\AwesomeBundle Sonntag, 6. Oktober 13

  17. Bundle Naming... Vendor\AwesomeBundle vs. Vendor\Bundle\AwesomeBundle Sonntag, 6. Oktober 13

  18. FAIL a.k.a. „because I can“ • MyCompleteAppBundle (ok for small

    projects) • MyAppNeedingGlobalResourcesBundle • MyBundleInsideAnotherBundleBundle Sonntag, 6. Oktober 13
  19. 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
  20. Your config options • YAML • XML • Annotations •

    INI • PHP Sonntag, 6. Oktober 13
  21. Your config options • YAML • XML • Annotations •

    INI • PHP meh. Sonntag, 6. Oktober 13
  22. Your config options • YAML • XML • Annotations •

    INI • PHP special use cases Sonntag, 6. Oktober 13
  23. Your config options • YAML • XML • Annotations •

    INI • PHP not for everything Sonntag, 6. Oktober 13
  24. Your config options • YAML • XML • Annotations •

    INI • PHP Routing, Bundle Config, Parameters Services Validators, ORM/ODM Sonntag, 6. Oktober 13
  25. Nest your routing files Sonntag, 6. Oktober 13

  26. Chapter Two Controllers Sonntag, 6. Oktober 13

  27. • Put Controllers on a Diet • Decouple them Sonntag,

    6. Oktober 13
  28. Try to lose the Boilerplate Sonntag, 6. Oktober 13

  29. @Template([name]) Sonntag, 6. Oktober 13

  30. @Cache(...) Sonntag, 6. Oktober 13

  31. Inject the Request into Controllers Sonntag, 6. Oktober 13

  32. New in 2.3: handleRequest() Sonntag, 6. Oktober 13

  33. Events for add-on actions Sonntag, 6. Oktober 13

  34. Service Layers Sonntag, 6. Oktober 13

  35. Service Layers Sonntag, 6. Oktober 13

  36. Using the BaseController? Wrap calls to the Container Sonntag, 6.

    Oktober 13
  37. Chapter Three Dependency Injection Sonntag, 6. Oktober 13

  38. Injecting the Container Sonntag, 6. Oktober 13

  39. Injecting the Container Sonntag, 6. Oktober 13

  40. But... but Symfony is doing it! Sonntag, 6. Oktober 13

  41. ...\TwigBundle\Extension\AssetsExtension Sonntag, 6. Oktober 13

  42. It‘s because of Scopes! Sonntag, 6. Oktober 13

  43. Solution: Synchronized Services (>= 2.3) Sonntag, 6. Oktober 13

  44. Alternative: Providing the Request (< 2.3) Sonntag, 6. Oktober 13

  45. Alternative: Providing the Request (< 2.3) Sonntag, 6. Oktober 13

  46. Service Organization Sonntag, 6. Oktober 13

  47. Split up Service Definitions Sonntag, 6. Oktober 13

  48. Dynamic Loading of Service Definitions Sonntag, 6. Oktober 13

  49. Use Semantic Configuration! Sonntag, 6. Oktober 13

  50. The Container as a Registry Sonntag, 6. Oktober 13

  51. The Container as a Registry Sonntag, 6. Oktober 13

  52. Instead: Proper Service Configuration Sonntag, 6. Oktober 13

  53. Binding to the Environment Sonntag, 6. Oktober 13

  54. Binding to the Environment Sonntag, 6. Oktober 13

  55. Instead: Use Your config files Sonntag, 6. Oktober 13

  56. 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
  57. Intermezzo Random Tips Sonntag, 6. Oktober 13

  58. PHP • Use 5.4/5.5, it‘s faster • Use APC (or

    one of the alternatives) Sonntag, 6. Oktober 13
  59. Composer • Use the --optimize-autoloader option Sonntag, 6. Oktober 13

  60. 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
  61. 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
  62. Translation • Work with translation keys instead of full text

    to avoid breaking translations Sonntag, 6. Oktober 13
  63. Searching • Look for „Symfony2“ (without the space) Sonntag, 6.

    Oktober 13
  64. Read the Documentation (and the Changelogs) Sonntag, 6. Oktober 13

  65. Chapter Four Forms Sonntag, 6. Oktober 13

  66. Forms in Controllers Sonntag, 6. Oktober 13

  67. Forms in Controllers Sonntag, 6. Oktober 13

  68. • Couples Form setup to Controller • No reusability Sonntag,

    6. Oktober 13
  69. Better: Use Type Classes Sonntag, 6. Oktober 13

  70. Always set the data_class Sonntag, 6. Oktober 13

  71. Using Data in Constructors Sonntag, 6. Oktober 13

  72. Using Data in Constructors Sonntag, 6. Oktober 13

  73. Use Form Events for Related Data Sonntag, 6. Oktober 13

  74. Define Types as Services Sonntag, 6. Oktober 13

  75. Define Types as Services Sonntag, 6. Oktober 13

  76. Don‘t disable CSRF Sonntag, 6. Oktober 13

  77. Don‘t disable CSRF Sonntag, 6. Oktober 13

  78. Thanks! Questions? Please give feedback: http://goo.gl/yK97XK Sonntag, 6. Oktober 13