+ All Categories
Transcript
Page 1: Symfony und Ember.js auf einer Seite #codetalks14

Symfony und Ember.js auf einer Seite

Paul SeiffertSensioLabs Deutschland GmbH

Page 2: Symfony und Ember.js auf einer Seite #codetalks14

Klassische Webseiten

Page 3: Symfony und Ember.js auf einer Seite #codetalks14

B R O W S E R

GET /

URL-Eingabe

HTMLWebseite

Link-Klick

Neue Webseite

GET /blog

HTML

S E R V E R

Klassische Webseiten

Page 4: Symfony und Ember.js auf einer Seite #codetalks14

HTML

R O U T I N G

C O N T R O L L E R

S E C U R I T Y

T E M P L AT I N G

GET /

BusinessLogikS Y M F O N Y

Klassische Symfony-Seiten

Page 5: Symfony und Ember.js auf einer Seite #codetalks14

Moderne Webseiten

Page 6: Symfony und Ember.js auf einer Seite #codetalks14

Moderne Webseiten

View-Wechsel

B R O W S E R

GET /

URL-Eingabe

HTMLWebseite

Link-Klick

Neue Webseite

… S E R V E R

Page 7: Symfony und Ember.js auf einer Seite #codetalks14

Moderne Webseiten

B R O W S E R

R O U T I N G

T E M P L AT I N G

C O N T R O L L E R

M O D E L

Page 8: Symfony und Ember.js auf einer Seite #codetalks14

B R O W S E R

Moderne WebseitenR O U T I N G

T E M P L AT I N G

C O N T R O L L E R

M O D E L

GET /api/users

JSON

S E R V E R

Page 9: Symfony und Ember.js auf einer Seite #codetalks14

PaulSeiffert

[email protected]

Page 10: Symfony und Ember.js auf einer Seite #codetalks14

Symfony und Ember.js auf einer Seite

Paul SeiffertSensioLabs Deutschland GmbH

Page 11: Symfony und Ember.js auf einer Seite #codetalks14

– FA B I E N P O T E N C I E R

“Symfony2 is an HTTP framework;it is a Request/Response framework.”

Page 12: Symfony und Ember.js auf einer Seite #codetalks14

B R O W S E RHTTP + Socket

GET /api/…Lokal

VM

S Y M F O N Y A P P

Page 13: Symfony und Ember.js auf einer Seite #codetalks14

B R O W S E R

GET /api/…Lokal

Server

S Y M F O N Y A P P

W E B S E R V E R

GET /

D AT E I S Y S T E M

Page 14: Symfony und Ember.js auf einer Seite #codetalks14

R O U T I N G

Page 15: Symfony und Ember.js auf einer Seite #codetalks14

Wohin möchte der Benutzer?

Page 16: Symfony und Ember.js auf einer Seite #codetalks14

posts: pattern: / methods: GET defaults: { _controller: BlogBundle:Post:index }post: pattern: /blog/{slug} methods: GET defaults: { _controller: BlogBundle:Post:detail }

Symfony Routing

Page 17: Symfony und Ember.js auf einer Seite #codetalks14

#http://example.com blog/first-article/

Page 18: Symfony und Ember.js auf einer Seite #codetalks14

var Router = Ember.Router.extend({ location: 'history'}); Router.map(function() { this.resource('blog', { path: '/' }, function () { this.route('post', { path: '/:slug' }); }); this.route('about'); });

PushState FTW!!Ember.js Routing

Page 19: Symfony und Ember.js auf einer Seite #codetalks14
Page 20: Symfony und Ember.js auf einer Seite #codetalks14

server { listen *:80;

server_name blog;

location / { root /opt/blog/dist; try_files $uri /index.html; index index.html; } }

Konfiguration

Page 21: Symfony und Ember.js auf einer Seite #codetalks14

/api

Page 22: Symfony und Ember.js auf einer Seite #codetalks14

location / { root /opt/blog/dist; try_files $uri /index.html; index index.html; }

/

/api/posts ⇒

/app.php/posts

/app.php/api

location ~ ^/api { root /opt/blog/web; try_files $uri @rewriteapp; index app.php; }

location @rewriteapp { rewrite ^/api/(.*)$ /app.php/$1 last; }

location ~ ^/(app|app_dev)\.php(/|$) { root /opt/blog/api/web; fastcgi_split_path_info /(.+\.php)(/.*)$; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9001; }

Page 23: Symfony und Ember.js auf einer Seite #codetalks14

M O D E L

Page 24: Symfony und Ember.js auf einer Seite #codetalks14

ember data

Page 25: Symfony und Ember.js auf einer Seite #codetalks14

var Post = DS.Model.extend({ title: DS.attr(), body: DS.attr(), date: DS.attr(), slug: DS.attr(), comments: DS.hasMany('comment', { async: true }), teaser: function () { return this.get('body').substr(0, 100); }.property('body') });

m o d e l s / p o s t . j s

Page 26: Symfony und Ember.js auf einer Seite #codetalks14

S T O R E

A D A P T E R

J S A P P L I K AT I O N

R E S T F U L A P I

Page 27: Symfony und Ember.js auf einer Seite #codetalks14

store.find('post', { slug: ‘awesome-blog-article‘})

GET /post?slug=awesome-blog-article

Page 28: Symfony und Ember.js auf einer Seite #codetalks14

{ "post": [ { "id": 1, "title": “Mein erster Blog Post", "body": “Das der Inhalt meines ersten Blog-Posts“, "date": "2014-10-04T14:23:10+0200", "slug": "first-post", "links": { "comments": "/app_dev.php/api/posts/first-post/comments" } } ]}

GET /post?slug=awesome-blog-article

Page 29: Symfony und Ember.js auf einer Seite #codetalks14

/first-post

Router.map(function() { this.resource('blog', { path: '/' }, function () { this.route('post', { path: '/:slug' }); }); });

ro u t e r. j s

Page 30: Symfony und Ember.js auf einer Seite #codetalks14

ro u t e r. j s

var BlogPostRoute = Ember.Route.extend({ model: function (params) { return this.store.find('post', { slug: params.slug }); }, serialize: function(model) { return { slug: model.get('slug') }; } });

ro u t e s / b l o g / p o s t . j s

Router.map(function() { this.resource('blog', { path: '/' }, function () { this.route('post', { path: '/:slug' }); }); });

Page 31: Symfony und Ember.js auf einer Seite #codetalks14

DS.RESTAdapter.extend({ namespace: ‘app_dev.php/api’ });

a d a p t e r s / a p p l i c a t i o n . j s

this.store.find('post')GET /app_dev.php/api/posts

this.store.find(‘post’, { slug: ‘first-post’ })GET /app_dev.php/api/posts?slug=first-post

this.store.find(‘post’, 1)GET /app_dev.php/api/posts/1

Page 32: Symfony und Ember.js auf einer Seite #codetalks14

R E S T F U L A P I

C O N T R O L L E R

R E P O S I T O R Y

D ATA B A S E

Page 33: Symfony und Ember.js auf einer Seite #codetalks14

R E S T F U L A P I

jms/serializer

willdurand/negotiation

symfony/symfony

willdurand/hateoas

⇒ http://www.slideshare.net/seiffertp

composer require

Page 34: Symfony und Ember.js auf einer Seite #codetalks14

ember data

Page 35: Symfony und Ember.js auf einer Seite #codetalks14
Page 36: Symfony und Ember.js auf einer Seite #codetalks14
Page 37: Symfony und Ember.js auf einer Seite #codetalks14

T E M P L AT I N G

Page 38: Symfony und Ember.js auf einer Seite #codetalks14
Page 39: Symfony und Ember.js auf einer Seite #codetalks14

<div class="container"> {{render 'navigation'}} <div class="container-fluid" id="content"> {{outlet}} </div></div>

a p p l i c a t i o n . h b s

Page 40: Symfony und Ember.js auf einer Seite #codetalks14

<div class="blog-post"> <h1>{{#link-to 'blog.post' slug}}{{title}}{{/link-to}}</h1> <div class="blog-post-content"> {{body}} </div> <div class="blog-post-comments"> {{#each comments}} {{partial 'blog/comment'}} {{/each}} </div></div>{{#link-to 'blog.index'}}Zurück zur Liste{{/link-to}}

b l o g / p o s t . h b s

Page 41: Symfony und Ember.js auf einer Seite #codetalks14

var Post = DS.Model.extend({ title: DS.attr(), body: DS.attr(), date: DS.attr(), slug: DS.attr(), comments: DS.hasMany('comment', { async: true }), teaser: function () { return this.get('body').substr(0, 100); }.property('body') });

m o d e l s / p o s t . j s

Page 42: Symfony und Ember.js auf einer Seite #codetalks14

<div class="blog-post"> <h1>{{#link-to 'blog.post' slug}}{{title}}{{/link-to}}</h1> <div class="blog-post-content"> {{body}} </div> <div class="blog-post-comments"> {{#each comments}} {{partial 'blog/comment'}} {{/each}} </div></div>{{#link-to 'blog.index'}}Zurück zur Liste{{/link-to}}

b l o g / p o s t . h b s

Page 43: Symfony und Ember.js auf einer Seite #codetalks14

T O O L S

Page 44: Symfony und Ember.js auf einer Seite #codetalks14
Page 45: Symfony und Ember.js auf einer Seite #codetalks14

$ ember serve —-proxy=http://symfony-api:80 version: 0.0.43 Proxying to http://symfony-api:80 Livereload server on port 35729 Serving on http://0.0.0.0:4200

$ npm install -g ember-cli

Page 46: Symfony und Ember.js auf einer Seite #codetalks14
Page 47: Symfony und Ember.js auf einer Seite #codetalks14
Page 48: Symfony und Ember.js auf einer Seite #codetalks14

B R O W S E RHTTP + Socket

N G I N X

S Y M F O N Y A P P

GET /app_dev.php/api/…

P H P - F P M

D e v e l o p m e n t

Lokal

VagrantVM

Page 49: Symfony und Ember.js auf einer Seite #codetalks14

B R O W S E R

N G I N X

S Y M F O N Y A P P

GET /api/…

P H P - F P M

P ro d u c t i o n

GET /

Page 50: Symfony und Ember.js auf einer Seite #codetalks14

https://github.com/ seiffert/ember-symfony-blog

Page 51: Symfony und Ember.js auf einer Seite #codetalks14

D A N K E !

Page 52: Symfony und Ember.js auf einer Seite #codetalks14

F R A G E N ?


Top Related