9. benefits?
• Flexibility.
• Decoupled architecture.
• (easily) Upgradable/changeable front-end.
• Dedicated/Focused teams.
• Happy front-end developers.
9 @brian_wardBut we already have a theme-layer in Drupal?
What are the
10. So what do we get
out of the box?
10 @brian_wardSo what do we get out of the box?
11. RESTful Web Services
RESTful Web Services exposes entities and
other resources as a RESTful web API.
Required
11 @brian_wardSo what do we get out of the box?
12. Serialization
Serialization module provides a service for
(de)serializing data to/from formats such as
JSON and XML
Required
12 @brian_wardSo what do we get out of the box?
13. HAL
Serializes entities using Hypertext
Application Language (HAL)
Optional
13 @brian_wardSo what do we get out of the box?
14. RESTUI
Provides a user interface for managing REST
resources.
Recommended
14 @brian_wardSo what do we get out of the box?
15. 3 waysto create a
REST API with D8
15 @brian_ward3 ways to create a REST API with D8
16. 16 @brian_ward3 ways to create a REST API with D8
Using the core RestResources
Using View REST exports
Create custom REST resources
Option #1
Option #2
Option #3
17. Using the core REST
resources
/node/{node}
/entity/block/{block}
/comment/{comment}
/entity/comment_type/{comment_type}
@brian_ward17
Option #1
Using the core REST resources
20. Pros & Cons
@brian_ward20
✓ Straight out of the box.
✓ Requires almost no setup.
✓ No custom code necessary.
- Exposes system information.
- Absolutely no flexibility.
- Lacks ability to version.
- Unable to limit output.
Using the core REST resources
21. Using views REST export
Views is now in core and also comes bundled with REST
support out of the box.
21 @brian_ward
Option #2
Using views REST export
23. 23 @brian_ward
Pros & Cons
✓ Straight out of the box.
✓ Familiar to developers.
✓ Manageable within the UI.
- Returns data with incorrect types.
- More flexibility, but still limited in
various areas.
- Authentication issues.
Using views REST export
24. Creating custom REST resources
Option #3 (recommended)
Being object-oriented by nature, D8 allows us to extend the base
ResourceBase class and create our own custom resources. This
would be my recommendation.
24 @brian_wardCreating custom rest resources
25. /**
* Provides a resource to get articles by UUID.
*
* @RestResource(
* id = "articles",
* label = @Translation("Articles (v1.0)"),
* uri_paths = {
* "canonical" = "/api/v1.0/articles/{uuid}"
* }
* )
*/
class ArticleBundleResource extends ResourceBase { }
25Plugin/Rest/Resource/ArticleBundleResource.php @brian_ward
30. HATEOAS
API Theory
HATEOAS is a constraint of the REST application architecture. In a
nutshell, it is providing information on how to navigate the site's
REST resources dynamically by including hypermedia links with
the responses.
30 @brian_wardHATEOAS
31. Content negotiation
To put it simply, this is the mechanism for determining what
content-type the data will be returned in.
31 @brian_wardHATEOAS
40. @brian_ward40
Now that we have created our API, we can play around
with it on the front-end.
Now we’re ready
41. Introducing Vue.js
Vue.js is a MVVM JavaScript library for building modern web
interfaces. It provides data-reactive components with a simple and
flexible API.
@brian_ward41Introducing Vue.js
42. Top trending JS framework on Github.
@brian_wardIntroducing Vue.js 42
First stable version released earlier this month.
Evan You is also a core developer on the MeteorJS
project & previously a Google employee.
Has awesome documentation.
43.
44. View
new Vue({ el: '#app' })
Each Vue instance is associated with a DOM element (el).
44 @brian_wardIntroducing Vue.js
45. ViewModel
45 @brian_ward
new Vue({ /* options */ })
• An object that syncs the Model and the View.
• Every Vue instance is a ViewModel.
Introducing Vue.js
46. Model
new Vue({ data: {} })
An object that is used as data inside a Vue instance will
become reactive (Vue instances that are observing our objects
will be notified of the changes).
@brian_ward46Introducing Vue.js
47. var MyComponent = Vue.extend({})
Components
47 @brian_ward
Components are simply a convenient way to structure and
organise our applications.
Optional
Introducing Vue.js
48. Browserify & Vueify
require('./app.vue')
48 @brian_ward
Browserify lets you require('modules') in the browser by
bundling up all of your dependencies.
Optional
Introducing Vue.js
51. So where does Drupal
come in?
51 @brian_wardIntroducing Vue.js
52.
53. Great, let’s see that in action!
Firstly we will need to create our package.json, HTML &
bootstrap JS files. From there we’ll load in our
components and interact with our API.
@brian_ward53Introducing Vue.js
56. /**
* Boot up the Vue instance with the VueResource plugin.
*/
var Vue = require(‘vue')
Vue.use(require(‘vue-resource’))
var app = new Vue(require('./app.vue'))
56start.js @brian_ward
57. /**
* Wire up the router.
*/
var Router = require('director').Router
var router = new Router()
router.on(‘/articles/:uuid’, function (uuid) {
app.view = 'article-view'
app.params.uuid = uuid
})
router.init('/')
57start.js @brian_ward
63. And that’s it.
By using Drupal 8 and Vue.js we’re able to create a beautiful,
maintainable and de-coupled application.
https://github.com/briward/examples
63 @brian_ward
64.
65. Useful links
65 @brian_ward
• http://vuejs.org
• https://en.wikipedia.org/wiki/Model_View_ViewModel
• http://browserify.org
• https://github.com/vuejs/vueify
• http://vuejs.org/guide/components.html
• http://www.w3.org/TR/components-intro
• http://drupal.org/project/restui
• ...how-to-enable-cors-requests-against-drupal-8/
• Phil Sturgeon’s book “Build APIs you won’t hate”.