Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Symfony 2 Die Perle in einem SOA-Ozean

Symfony 2 Die Perle in einem SOA-Ozean

This Presentation was held in german, at the Symfony Live Berlin 2013. on 07.11.2013

Avatar for Marco Reinwarth

Marco Reinwarth

November 11, 2013

Other Decks in Programming

Transcript

  1. Wer sind wir? Wer sind wir Kifah Abbad & Marco

    Reinwarth Wo arbeiten wir devbliss GmbH
  2. Agenda Die Motivation Symfony 2 einzusetzen und der Weg dorthin

    Symfony Besonderheiten & “Best Practices”
  3. Motivation Motivation Symfony 2 einzusetzen “die Geschichte wie Symfony2 immer

    mehr Gewicht bei devbliss bekommen hat” “Wie kann ich mein bestehendes Projekt mit Symfony2 aufwerten”
  4. Services GWT Mobile Reverse Proxy Symfony 2 - PHP REST

    Api PHP Legacy Code Java Service Python Service ...
  5. Services Reverse Proxy Symfony 2 - PHP REST Api PHP

    Legacy Code Routen Konfiguration
  6. Services Reverse Proxy Symfony 2 - PHP REST Api PHP

    Legacy Code Routen Konfiguration
  7. Services Client Reverse Proxy Symfony 2 - PHP REST Api

    PHP Legacy Code Service signing verify
  8. Services GWT Mobile Reverse Proxy Symfony 2 - PHP REST

    Api PHP Legacy Code Java Service Python Service ...
  9. Bestehende Systeme erweitern Client Symfony 2 - PHP REST Api

    PHP Legacy Code Mobile App Entwickler 3rd Party Apps
  10. unser Weg vom Monolithen zu Symfony 2 • klein beginnen

    • Continuous Shipping • aus Erfahrungen lernen • Symfonys Flexibilität nutzen
  11. Symfony2 Besonderheiten Die Schönheit von Symfony2, kommt zur Geltung Einheitlichkeit

    → DevblissBundle • Abstrakter, Wiederverwendbarer Bundle • git submodule ◦ Eigene Annotationen (Custom Annotations) ◦ Event Listener ◦ Genereller Controller ◦ ……..USW
  12. Symfony2 Besonderheiten Eigene Annotationen Beispiel 1: JsonKey class ActivityImportEvent extends

    Event { /** * answers property * @Assert\Type("array") * @Assert\NotNull(message="field_cannot_be_null") * @Assert\NotBlank(message="field_cannot_be_empty") * @JsonKey("myAnswers") */ protected $answers = array(); GWT-Frontend Reverse Proxy Symfony2 Backend $answers=.... { “myAnswers”=... }
  13. Symfony2 Besonderheiten Eigene Annotationen Beispiel 2: Signed Objects @Route("/what/ever", requirements

    = {...}, options = { "payload" = { "name" = {...}, "permission" = { "required" = true, "type" = "\User\Permission", "signed" = true }, } }
  14. Symfony2 Besonderheiten Eigene Annotationen Beispiel 2: Signed Objects @Route("/what/ever", requirements

    = {...}, options = { "payload" = { "name" = {...}, "permission" = { "required" = true, "type" = "\User\Permission[]”, "signed" = true }, } }
  15. Symfony2 Besonderheiten Event Listener 1 - Exceptions Listener Reverse Proxy

    Symfony2 App → devbliss.exception_listener Event:kernel.exception
  16. Symfony2 Besonderheiten Eigene Error Exceptions Listener • Keine HTML Seiten

    -> JSON-Error Payload • Ins Symfony Log schreiben • Eindeutige ID zum Wiedererkennen { "errorDetail":[ ], "errorId":"4564b6456456b54645b6", "errorMessage":"users_userid_avatar_put_no_payload", "errorType":"Exception" }
  17. Symfony2 Besonderheiten Eigener Exceptionslistener //BadRequestException() if ($classId == '') {

    throw new BadRequestException(); } //ValidationException if (!$user->isValidPassword($newPassword)) { throw new ValidationException(array(),'new password invalid'); }
  18. Symfony2 Besonderheiten Eigener Exceptions Listener #service.yml (Devbliss Bundle) services: devbliss.exception_listener:

    class: Devbliss\CoreBundle\EventListener\ExceptionListener arguments: - @templating - @logger tags: - { name: kernel.event_listener, event: kernel.exception, method: onCoreException }
  19. Symfony2 Besonderheiten Event Listener 2 - Url Parameter Controller Listener

    Reverse Proxy Symfony2 App → devbliss.controller_listener.url_parameter Event:kernel.controller
  20. Symfony2 Besonderheiten Event Listener 3 - Url Parameter Controller Listener

    /** * * @Route("activity/{id}", * requirements = { * "id" = "\d+", * "tokens" = "(\d+(?:,\d+)*)", * } * ) */ public function getActivityResults($id, Array $tokens) { Route: activity/45/5 => $id = 45, $tokens = array(5) Route: activity/45/5,6,7 => $id = 45, $tokens = array(5,6,7)
  21. Symfony2 Besonderheiten Event Listener - Reverse Proxy Session Listener Reverse

    Proxy Symfony2 App → devbliss.request_listener.reverse_proxy_session Event:kernel.request
  22. Symfony2 Besonderheiten Allgemeiner Controller • Wiederverwendbarkeit, Controller schlank halten abstract

    class Controller extends SymfonyController { protected function getSession() protected function performValidation() ......
  23. Symfony2 Besonderheiten Klassen in den DI-Container als Services service.yml sams_memcached:

    class: "Jura\MemcachedBundle\Service\MemcachedService" arguments: [@service_container] quiz_service: class: "Jura\QuizBundle\Service\QuizService" arguments: [@service_container]
  24. Symfony2 Besonderheiten Weitere Populäre Symfony Features • ORM/ODM Fixtures •

    Symfony2 @Asserts, eigene Asserts • Doctrine Tree Extension Unit Section ActivitySet ActivitySet
  25. Symfony 2 Die Perle in einem SOA-Ozean Danke! Fragen ?

    http://joind.in/9756 Slides bald auf http://www.devbliss. com