API Platform 2.1: when Symfony meets ReactJS (Symfony Live 2017)

CEO at, freelance software architect
Apr. 3, 2017

More Related Content

Similar to API Platform 2.1: when Symfony meets ReactJS (Symfony Live 2017)(20)


API Platform 2.1: when Symfony meets ReactJS (Symfony Live 2017)

  1. API PLATFORM 2.1 When Symfony meets React
  2. Kévin Dunglas Founder of Symfony Core Team API Platform creator @dunglas
  3. Self-managed company since 2011 100% owned by employees 19 people, 97% growth in 2016 Hiring in Lille, London and Amiens:
  4. The Web of 2017
  5. APIs: the Heart of the New Web Central point to access data Encapsulate the business logic Same features available for all channels: webapps, native mobile apps, IoT, enterprise, customers and providers information systems APIs are the foundations of this new web
  6. SPA: Rich and Fast Webapps Downloaded and executed only 1 time (first page load) Use asynchronous HTTP requests to retrieve and modify the raw data (usually JSON) using an API Huge ecosystem: React/Redux, Angular, Vue, Ember… and probably a new one while I’m speaking Holds the presentation logic (good-bye Twig) Standalone apps built using JavaScript, HTML and CSS Modernized stack: ES2015/16/17, Babel, Webpack, Yarn, Flow, TypeScript…
  7. Native Mobile Apps Use HTTP requests to retrieve and modify the raw data (usually JSON) using an API but can also work offline Can be developed using the JS stack: React Native, NativeScript (Angular) - good-bye Cordova Downloaded from stores (App Store, Google Play) Look’n’Feel consistent with the platform (iOS or Android)
  8. API Platform: a Framework for 2017
  9. Goals of the Framework Support modern open API formats Create a rock-solid API-first system in minutes Batteries included: everything to create and consume the API Be able to override, extend and customize everything
  10. Features of API Platform 2.0
  11. They Already Use API Platform
  12. Getting Started
  13. Install Get Docker If you don’t already have it…
  14. Install Provided Docker images - PHP, Nginx, MySQL and Varnish (optional) optimized for Symfony: Create the database: Download and extract the ZIP from Browse http://localhost $ docker-compose up $ docker-compose exec php bin/console doctrine:schema:create
  15. A working API with just 1 PHP class
  16. Your Turn!
  17. Create your Own Data Model Write some PHPDoc (optional) Add the @ApiResource annotation Map its properties using the Doctrine ORM (optional) Update the database schema $ docker-compose run web bin/console doctrine:schema:update --force Create a Plain Old PHP Object
  18. Your API is Ready!
  19. Out of the Box Features JSON-LD + Hydra encoding (HAL, XML, YAML, CSV and raw JSON can be enabled through config and you can add yours) Swagger documentation Fully featured JavaScript UI using Swagger UI (now built with React) available for all URLs of the API Create (POST), Retrieve (GET item and lists), Update (PUT) and Delete (DELETE) operations Pagination for lists (30 items per page), fully configurable
  20. What’s this Format? JSON-LD and Hydra
  21. Credit: Martin Fowler
  22. JSON-LD Standardized hypermedia format: W3C recommandation (2014) Easy to use: a standard JSON document with some specials keys (starting with @) and mapped with a context Backed by Google, BBC, Microsoft, US & UK govs... Compliant with technologies of the semantic web: RDF, SPARQL, triple store... JSON for Linked Data
  23. Hydra Make the API auto-discoverable by clients: all available resources, properties, types and operations are described Provide a standard format for common structures: collections, paginations, filters, errors… Documentation of the REST API in JSON-LD Draft W3C
  24. Data Validation
  25. Add validation rules Many validation constraints available Ability to create custom constraints Use the Symfony Validator component
  26. Relations
  27. Add a Relation
  28. Embedding Relations
  29. Embedded Relations
  30. How does it Work?
  31. REST Wikipedia
  32. Lexicon Operation: action on an item or on a collection, usually through HTTP. Internally a Symfony route. DELETE /books/22 Resource: data exposed by the API, identified by an URL. Internally a PHP object (an entity), externally a document (JSON, HTML, XML…). item: /books/22 collection: /books Property: property of a resource. Internally, a class’ property. Externally a document field (e.g. a JSON property). Typed.
  33. It’s Symfony… Configured with the most popular libraries for APIs Compatible with all existing bundles Use Doctrine ORM by default (but you can use the persistence system you want) Symfony full stack application
  34. …with something more Properties’ types and relations are guessed using the Symfony PropertyInfo component The Metadata component guesses the API’s data structure (resources and properties) form PHP classes marked with @ApiResource The structure is stored in an intermediate representation used to serialize data and generate API docs (Hydra, Swagger…)
  35. And Even More… Symfony routes are automatically registered for all operations on collections and items. By default: item: GET, PUT, DELETE collection: GET, POST Data is normalized and denormalized using hypermedia normalizers (JSON-LD, Hydra, HAL…) for the Symfony Serializer Component
  36. Event-Driven Architecture
  37. Client-Side Tooling
  38. Foundation of the most popular JS ecosystem out there A JavaScript library for building user interfaces Created by Facebook JSX: write markup inside code
  39. Just like Composer, but for JavaScript. $ curl -o- -L | bash $ brew install yarn Mac users:
  40. Create React App Babel: a JavaScript compiler (ES2015+, JSX, Flow…) An app skeleton generator All tools and configs to get started: Webpack: a module bundler (compile and package your JS, CSS…) $ yarn global add create-react-app $ create-react-app my-app $ cd my-app $ yarn start ESLint: identify and report bugs and bad patterns in the code Integrated web server, live reloading, development and debugging tools
  41. A Basic React Component
  42. Adding some Properties
  43. Adding some Properties
  44. Configuring CORS headers
  45. Loading Some Fixtures
  46. Loading some Fixtures $ docker-compose exec php bin/console hautelook:fixtures:load
  47. The Admin Generator
  48. API Platform Admin Like Sonata or EasyAdminBundle but as a React SPA Built on top of Admin On Rest (by Marmelab) $ yarn add api-platform-admin Material Design UI Consume the API using AJAX Automatically generate the admin by parsing the Hydra API doc
  49. API Platform Admin
  50. Customizing the Admin
  51. The CRUD Generator
  52. API Platform Generate CRUD Like Sensio Generator Bundle, but 100% client-side Rock solid stack $ yarn global add api-platform-generate-crud Twitter Bootstrap support + accessibility (ARIA roles) Consume the API using ES2015’s fetch() Automatically generate files by parsing the Hydra API doc
  53. The Stack React, ES2015+, JSX React Router: client-side routing library Redux: an extensible container to manage the states of the app Redux Form: manage form states Redux Thunk: asynchronous actions (AJAX requests) Optional: Twitter Bootstrap
  54. Redux
  55. Register the Generated code
  56. The API Client
  57. Actions and Creators
  58. Reducers
  59. Components…
  60. …Components Wiring
  61. The Form
  62. React Native Generator Coming Soon!
  63. Thanks! Any questions? api-platform/api-platform @ApiPlatform
  64. Extra: More Features!
  65. New in API Platform 2.1 An API as fast as a static website: builtin invalidation-based HTTP cache (Varnish and CloudFlare support) Client-side tools to consume the API built with React and Redux: an app generator and an admin Advanced, per-operation authorization rules Native sub-resources support (e.g. GET /users/1/comments) A ton of Developer eXperience improvements and better docs
  66. Filters Register the filter service (built-in or custom): Map the filter to the resource
  67. Filters
  68. Content Negotiation Adding a new format is as simple as creating a new Symfony Normalizer for it Built-in formats: JSON-LD, HAL, XML, YAML, CSV, JSON, HTML (UI) To retrieve a resource in a given format: add an Accept HTTP header or use the format name as file extension
  69. Content Negotiation
  70. Content Negotiation: HAL
  71. Content Negotiation: XML
  72. Events
  73. The Schema Generator Pick an existing data model from (resources and properties) from $ docker-compose exec php vendor/bin/schema generate-types src/ schema.yml
  74. The Schema Generator
  75. The Schema Generator PHP classes, properties, getters and setters (PSR compliant) Doctrine ORM mapping (including relations and mapped superclasses) Validation constraints Full PHPDoc extracted from schema human-readable descriptions Mapping with's IRIs The generator uses data to automatically bootstrap: Relations between classes (supported by the API system too)
  76. Rate this talk: Follow me: @dunglas