Symfony 2 Die Perle in einem SOA-Ozean

42
Symfony 2 Die Perle in einem SOA-Ozean

description

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

Transcript of Symfony 2 Die Perle in einem SOA-Ozean

Page 1: Symfony 2 Die Perle in einem SOA-Ozean

Symfony 2Die Perle in einem SOA-Ozean

Page 2: Symfony 2 Die Perle in einem SOA-Ozean

Wer sind wir?

Wer sind wirKifah Abbad & Marco Reinwarth

Wo arbeiten wirdevbliss GmbH

Page 3: Symfony 2 Die Perle in einem SOA-Ozean

Agenda

Die Motivation Symfony 2 einzusetzen und der Weg dorthin

Symfony Besonderheiten & “Best Practices”

Page 4: Symfony 2 Die Perle in einem SOA-Ozean

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”

Page 5: Symfony 2 Die Perle in einem SOA-Ozean

Der Monolith

Page 6: Symfony 2 Die Perle in einem SOA-Ozean

neue Ideen

Chat

NotificationsGamification

Apps

Feed

Mobile

DesignResponsive

Page 7: Symfony 2 Die Perle in einem SOA-Ozean

Services

GWT Mobile

Reverse Proxy

PHP Legacy Code

Java Service

Python Service ...

?

Page 8: Symfony 2 Die Perle in einem SOA-Ozean

Services

GWT Mobile

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Java Service

Python Service ...

Page 9: Symfony 2 Die Perle in einem SOA-Ozean

Services

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Routen Konfiguration

Page 10: Symfony 2 Die Perle in einem SOA-Ozean

Services

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Routen Konfiguration

Page 11: Symfony 2 Die Perle in einem SOA-Ozean

Services

Client

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy CodeService

signingverify

Page 12: Symfony 2 Die Perle in einem SOA-Ozean

Services

GWT Mobile

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Java Service

Python Service ...

Page 13: Symfony 2 Die Perle in einem SOA-Ozean

Bestehende Systeme erweitern

Client

Symfony 2 - PHP REST Api

PHP Legacy Code

Mobile AppEntwickler3rd Party Apps

Page 14: Symfony 2 Die Perle in einem SOA-Ozean

Bestehende Systeme erweitern

Client

PHP Legacy CodeSymfony 2 - Service

Page 15: Symfony 2 Die Perle in einem SOA-Ozean

unser Weg vom Monolithen zu Symfony 2

● klein beginnen● Continuous Shipping● aus Erfahrungen lernen● Symfonys Flexibilität nutzen

Page 16: Symfony 2 Die Perle in einem SOA-Ozean

heute

Learning Management System

Page 17: Symfony 2 Die Perle in einem SOA-Ozean

LMS

Assessment Engine

Question Management

AMQP

Symfony Applications

Talking AMQP

Page 18: Symfony 2 Die Perle in einem SOA-Ozean

LMS

GWT JS

Reverse Proxy

Product & User Management

Assessment Engine

Question Management

AMQP

Page 19: Symfony 2 Die Perle in einem SOA-Ozean

Teil 2

Symfony Besonderheiten & “Best Practices”

Page 20: Symfony 2 Die Perle in einem SOA-Ozean

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

Page 21: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Eigene AnnotationenBeispiel 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”=... }

Page 22: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Eigene AnnotationenBeispiel 2: Signed Objects

@Route("/what/ever",

requirements = {...},

options = {

"payload" = {

"name" = {...},

"permission" = {

"required" = true,

"type" = "\User\Permission",

"signed" = true

},

}

}

Page 23: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Eigene AnnotationenBeispiel 2: Signed Objects

@Route("/what/ever",

requirements = {...},

options = {

"payload" = {

"name" = {...},

"permission" = {

"required" = true,

"type" = "\User\Permission[]”,

"signed" = true

},

}

}

Page 24: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Event Listener 1 - Exceptions Listener

Reverse Proxy

Symfony2 App → devbliss.exception_listener

Event:kernel.exception

Page 25: Symfony 2 Die Perle in einem SOA-Ozean

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"}

Page 26: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Eigener Exceptionslistener

//BadRequestException()

if ($classId == '') {

throw new BadRequestException();

}

//ValidationException

if (!$user->isValidPassword($newPassword)) {

throw new ValidationException(array(),'new password invalid');

}

Page 27: Symfony 2 Die Perle in einem SOA-Ozean

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 }

Page 28: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Event Listener 2 - Url Parameter Controller Listener

Reverse Proxy

Symfony2 App → devbliss.controller_listener.url_parameter

Event:kernel.controller

Page 29: Symfony 2 Die Perle in einem SOA-Ozean

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)

Page 30: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Event Listener - Reverse Proxy Session Listener

Reverse Proxy

Symfony2 App → devbliss.request_listener.reverse_proxy_session

Event:kernel.request

Page 31: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Allgemeiner Controller

● Wiederverwendbarkeit, Controller schlank halten

abstract class Controller extends SymfonyController

{

protected function getSession()

protected function performValidation()

......

Page 32: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Symfony Console Component

Page 33: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Symfony Console Component-Produkte Import

Products

Units

Sections

Activity Sets

php app/console jura:prod_import

Page 34: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Doctrine Fixtures -> DB-Dumps

array()....foreach…..

php app/console qm:dump_fixture

Page 35: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

RabbitMQ-Consumers/Workers

php app/console ae:result_worker

Page 36: Symfony 2 Die Perle in einem SOA-Ozean

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]

Page 37: Symfony 2 Die Perle in einem SOA-Ozean

Symfony2 Besonderheiten

Weitere Populäre Symfony Features

● ORM/ODM Fixtures

● Symfony2 @Asserts, eigene Asserts

● Doctrine Tree Extension Unit

Section

ActivitySet

ActivitySet

Page 38: Symfony 2 Die Perle in einem SOA-Ozean

Symfony Code

Trennung und Individualisierung

/usr/share/hauptprojekt

/etc

/var/log/hauptprojekt

/var/cache/hauptprojekt

Sources

configs ( z.B. parameter.yml)

Logs (prod.log...usw)

Caches (/prod….usw)

Page 39: Symfony 2 Die Perle in einem SOA-Ozean

Continuous Integration

Page 40: Symfony 2 Die Perle in einem SOA-Ozean

Continuous Integration

Doctests (Integration Tests)

PHP Code Sniffer

Mockery

Page 41: Symfony 2 Die Perle in einem SOA-Ozean

Fazit

Symfony2 ist und bleibt ein wichtiger Teil unserer Infrastruktur

Page 42: Symfony 2 Die Perle in einem SOA-Ozean

Symfony 2 Die Perle in einem SOA-Ozean

Danke!Fragen ?

http://joind.in/9756

Slides bald auf http://www.devbliss.com