Symfony 2 Die Perle in einem SOA-Ozean

Post on 25-May-2015

370 views 2 download

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

Symfony 2Die Perle in einem SOA-Ozean

Wer sind wir?

Wer sind wirKifah Abbad & Marco Reinwarth

Wo arbeiten wirdevbliss GmbH

Agenda

Die Motivation Symfony 2 einzusetzen und der Weg dorthin

Symfony Besonderheiten & “Best Practices”

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”

Der Monolith

neue Ideen

Chat

NotificationsGamification

Apps

Feed

Mobile

DesignResponsive

Services

GWT Mobile

Reverse Proxy

PHP Legacy Code

Java Service

Python Service ...

?

Services

GWT Mobile

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Java Service

Python Service ...

Services

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Routen Konfiguration

Services

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Routen Konfiguration

Services

Client

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy CodeService

signingverify

Services

GWT Mobile

Reverse Proxy

Symfony 2 - PHP REST Api

PHP Legacy Code

Java Service

Python Service ...

Bestehende Systeme erweitern

Client

Symfony 2 - PHP REST Api

PHP Legacy Code

Mobile AppEntwickler3rd Party Apps

Bestehende Systeme erweitern

Client

PHP Legacy CodeSymfony 2 - Service

unser Weg vom Monolithen zu Symfony 2

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

heute

Learning Management System

LMS

Assessment Engine

Question Management

AMQP

Symfony Applications

Talking AMQP

LMS

GWT JS

Reverse Proxy

Product & User Management

Assessment Engine

Question Management

AMQP

Teil 2

Symfony Besonderheiten & “Best Practices”

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

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

Symfony2 Besonderheiten

Eigene AnnotationenBeispiel 2: Signed Objects

@Route("/what/ever",

requirements = {...},

options = {

"payload" = {

"name" = {...},

"permission" = {

"required" = true,

"type" = "\User\Permission",

"signed" = true

},

}

}

Symfony2 Besonderheiten

Eigene AnnotationenBeispiel 2: Signed Objects

@Route("/what/ever",

requirements = {...},

options = {

"payload" = {

"name" = {...},

"permission" = {

"required" = true,

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

"signed" = true

},

}

}

Symfony2 Besonderheiten

Event Listener 1 - Exceptions Listener

Reverse Proxy

Symfony2 App → devbliss.exception_listener

Event:kernel.exception

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

Symfony2 Besonderheiten

Eigener Exceptionslistener

//BadRequestException()

if ($classId == '') {

throw new BadRequestException();

}

//ValidationException

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

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

}

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 }

Symfony2 Besonderheiten

Event Listener 2 - Url Parameter Controller Listener

Reverse Proxy

Symfony2 App → devbliss.controller_listener.url_parameter

Event:kernel.controller

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)

Symfony2 Besonderheiten

Event Listener - Reverse Proxy Session Listener

Reverse Proxy

Symfony2 App → devbliss.request_listener.reverse_proxy_session

Event:kernel.request

Symfony2 Besonderheiten

Allgemeiner Controller

● Wiederverwendbarkeit, Controller schlank halten

abstract class Controller extends SymfonyController

{

protected function getSession()

protected function performValidation()

......

Symfony2 Besonderheiten

Symfony Console Component

Symfony2 Besonderheiten

Symfony Console Component-Produkte Import

Products

Units

Sections

Activity Sets

php app/console jura:prod_import

Symfony2 Besonderheiten

Doctrine Fixtures -> DB-Dumps

array()....foreach…..

php app/console qm:dump_fixture

Symfony2 Besonderheiten

RabbitMQ-Consumers/Workers

php app/console ae:result_worker

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]

Symfony2 Besonderheiten

Weitere Populäre Symfony Features

● ORM/ODM Fixtures

● Symfony2 @Asserts, eigene Asserts

● Doctrine Tree Extension Unit

Section

ActivitySet

ActivitySet

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)

Continuous Integration

Continuous Integration

Doctests (Integration Tests)

PHP Code Sniffer

Mockery

Fazit

Symfony2 ist und bleibt ein wichtiger Teil unserer Infrastruktur

Symfony 2 Die Perle in einem SOA-Ozean

Danke!Fragen ?

http://joind.in/9756

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