API Platform and Symfony: a Framework for API-driven Projects

80
API PLATFORM A framework for API-driven Projects

Transcript of API Platform and Symfony: a Framework for API-driven Projects

Page 1: API Platform and Symfony: a Framework for API-driven Projects

API PLATFORMA framework for API-driven Projects

Page 2: API Platform and Symfony: a Framework for API-driven Projects

Kévin DunglasFounder of Les-Tilleuls.coop

Symfony Core Team

API Platform creator

@dunglas

Page 3: API Platform and Symfony: a Framework for API-driven Projects

Les-Tilleuls.coopSelf-managed company since 2011

100% owned by employees

25 people, 97% growth in 2016

Hiring in London, Paris and Lille: [email protected]

Page 4: API Platform and Symfony: a Framework for API-driven Projects

The Web of 2017

Page 5: API Platform and Symfony: a Framework for API-driven Projects

APIs: the Heart of the New Web

Page 6: API Platform and Symfony: a Framework for API-driven Projects

Progressive Web Apps

Downloaded only 1 time, works offline!

Sends async HTTP requests to the API

Huge ecosystem: React, Angular, Vue…

Holds the presentation logic

Static « website »: JS, HTML and CSS

Modernized stack:ES2015, Babel, Webpack, Yarn, Flow, TypeScript, ReasonML…

Page 7: API Platform and Symfony: a Framework for API-driven Projects

Native Mobile Apps

Sync data by sending HTTP requests to the API

JS stack:React Native, NativeScript

Downloaded from stores (App Store, Google Play)

Look’n’Feel consistent with the platform (iOS or Android)

Page 8: API Platform and Symfony: a Framework for API-driven Projects

Cloud Native Projects

Software built, tested and deployed continuously

Rich and open ecosystem:Docker, Kubernetes, Mesos, Terraform…

Projects are hosted on public and private clouds

Containers and orchestration from dev stations to prod

Page 9: API Platform and Symfony: a Framework for API-driven Projects

A Frameworkfor the Modern Web

Page 10: API Platform and Symfony: a Framework for API-driven Projects

Goals

Modern API formats

A rock-solid API-first project in minutes

Batteries included:create, consume and deploy the API

Customizable, extensible, modular:config, events, decoration…

Page 11: API Platform and Symfony: a Framework for API-driven Projects

They already Use API Platform

Page 12: API Platform and Symfony: a Framework for API-driven Projects

Getting Started

Page 13: API Platform and Symfony: a Framework for API-driven Projects

Get DockerIf you don’t have it yet…

Page 14: API Platform and Symfony: a Framework for API-driven Projects

Install

Grab a release on GitHub

Browse https://localhost

$ docker-compose up

Page 15: API Platform and Symfony: a Framework for API-driven Projects
Page 16: API Platform and Symfony: a Framework for API-driven Projects

Just 1 class

Page 17: API Platform and Symfony: a Framework for API-driven Projects

Included (v2.1 - stable)

PHP FPM and Nginx containers, sensitive defaults for Symfony

Varnish container (more about this later)

Cross-platform Docker setup

MySQL container

Symfony Edition fine tuned for APIs

Page 18: API Platform and Symfony: a Framework for API-driven Projects

Upcoming Changes

HTTP/2 and HTTPS dev proxy

Containers for JS dev 🤔 🤗

Symfony Standard Edition Symfony Flex

Simplified directory structure

MySQL PostgreSQL

api-platform/api-platform@master

Page 19: API Platform and Symfony: a Framework for API-driven Projects

Too Much?

Page 20: API Platform and Symfony: a Framework for API-driven Projects

Go Micro with Flex

Browse http://localhost:8000

$ composer create-p symfony/skeleton api $ cd api $ composer req api

$ php -S 127.0.0.1:8000 -t public

Page 21: API Platform and Symfony: a Framework for API-driven Projects

Your Turn!

Page 22: API Platform and Symfony: a Framework for API-driven Projects

Create yourClass

PHPDoc extraction (optional)

The hook:@ApiResourceXML and YAML also supported

Doctrine integration (optional)

$ docker-compose exec php bin/console \ doctrine:schema:update --force

Plain Old PHP Object

Page 23: API Platform and Symfony: a Framework for API-driven Projects

Your 1st API is ready!

Page 24: API Platform and Symfony: a Framework for API-driven Projects
Page 25: API Platform and Symfony: a Framework for API-driven Projects

Out of the Box Features

JSON-LD + Hydra formatsBut also… JSONAPI, HAL, XML, YAML, CSV and raw JSON…

OpenAPI (aka Swagger) doc

Nice UI (Swagger UI)

POST, GET (item and lists), PUT, DELETE

Pagination for lists (30 items per page), fully configurable

Page 26: API Platform and Symfony: a Framework for API-driven Projects

Data Validation

Page 27: API Platform and Symfony: a Framework for API-driven Projects

Symfony

Validation groups

Error levels

Symfony Validator integration

Page 28: API Platform and Symfony: a Framework for API-driven Projects
Page 29: API Platform and Symfony: a Framework for API-driven Projects

Relations

Page 30: API Platform and Symfony: a Framework for API-driven Projects

Class with a Relation

Page 31: API Platform and Symfony: a Framework for API-driven Projects
Page 32: API Platform and Symfony: a Framework for API-driven Projects

Embedding Relations

Page 33: API Platform and Symfony: a Framework for API-driven Projects

Embedded Relations

Page 34: API Platform and Symfony: a Framework for API-driven Projects

HTTP Cache (invalidation)

Page 35: API Platform and Symfony: a Framework for API-driven Projects

HTTP cache (invalidation)GET responses generated only 1 time, then served by Varnish(also work with CloudFlare and any cache proxy supporting tags)

Responses tagged with IRIs (URLs) of resources they contain(including relations, embedded resources…)

When a write operation occurs cached responses containing outdated data are purged

Builtin, single config flag, trusted proxies config provided

Browse https://localhost:444

Page 36: API Platform and Symfony: a Framework for API-driven Projects

Other Features

Page 37: API Platform and Symfony: a Framework for API-driven Projects
Page 38: API Platform and Symfony: a Framework for API-driven Projects

How does it Work?

Page 39: API Platform and Symfony: a Framework for API-driven Projects

Core Library

Page 40: API Platform and Symfony: a Framework for API-driven Projects

Metadata Subsystem

Properties’ types and relations extracted with Symfony PropertyInfo

Guesses API’s structure (resources and properties)from classes marked@ApiResource

Intermediate representation of the API structure

Used by Hypermedia normalizers (JSON-LD, Hydra, HAL…)registered in the Symfony Serializer

Page 41: API Platform and Symfony: a Framework for API-driven Projects

Event-Driven Architecture

Page 42: API Platform and Symfony: a Framework for API-driven Projects

JSON-LD and Hydra

Page 43: API Platform and Symfony: a Framework for API-driven Projects

JSON-LDStandardized 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

Page 44: API Platform and Symfony: a Framework for API-driven Projects
Page 45: API Platform and Symfony: a Framework for API-driven Projects
Page 46: API Platform and Symfony: a Framework for API-driven Projects
Page 47: API Platform and Symfony: a Framework for API-driven Projects
Page 48: API Platform and Symfony: a Framework for API-driven Projects
Page 49: API Platform and Symfony: a Framework for API-driven Projects
Page 50: API Platform and Symfony: a Framework for API-driven Projects

Hydra

auto-discoverable API:resources, properties, types, operations

Standardize common API structures:collections, paginations, filters, errors…

In-band API doc

Draft W3C

Page 51: API Platform and Symfony: a Framework for API-driven Projects
Page 52: API Platform and Symfony: a Framework for API-driven Projects
Page 53: API Platform and Symfony: a Framework for API-driven Projects

Data Fixtures

Page 54: API Platform and Symfony: a Framework for API-driven Projects

More Properties

Page 55: API Platform and Symfony: a Framework for API-driven Projects

More Properties

Page 56: API Platform and Symfony: a Framework for API-driven Projects

Install$ docker-compose exec php \ composer req \ doctrine/data-fixtures:^1.2 \ nelmio/alice:^3.0 \ theofidry/alice-data-fixtures:^1.0@beta \ hautelook/alice-bundle:^2.0@beta

Page 57: API Platform and Symfony: a Framework for API-driven Projects

Loading Fixtures

$ docker-compose exec php bin/console hautelook:fixtures:load

Page 58: API Platform and Symfony: a Framework for API-driven Projects

Client-sidetools

Page 59: API Platform and Symfony: a Framework for API-driven Projects

Admin

Page 60: API Platform and Symfony: a Framework for API-driven Projects

API Platform AdminSonata EasyAdmin-like but as a React PWA

Built on top of Admin On Rest (by Marmelab)

Material Design

Automatically generates the admin by parsing the Hydra API doc

Browse https://localhost:8001

Page 61: API Platform and Symfony: a Framework for API-driven Projects
Page 62: API Platform and Symfony: a Framework for API-driven Projects

Alternatively…

$ yarn add @api-platform/admin

From any React installation:

Page 63: API Platform and Symfony: a Framework for API-driven Projects

Minimal Implementation

Page 64: API Platform and Symfony: a Framework for API-driven Projects

Customizing the Admin

Page 65: API Platform and Symfony: a Framework for API-driven Projects
Page 66: API Platform and Symfony: a Framework for API-driven Projects

Clients Generator

Page 67: API Platform and Symfony: a Framework for API-driven Projects

React PWA Generator (default)SensioGeneratorBundle-like, 100% client-side

Rock solid stack

$ yarn global add @api-platform/client-generator

Twitter Bootstrap support + accessibility (ARIA roles)

Use ES2015’s fetch()

Parse Hydra API doc to generate files

Page 68: API Platform and Symfony: a Framework for API-driven Projects
Page 69: API Platform and Symfony: a Framework for API-driven Projects
Page 70: API Platform and Symfony: a Framework for API-driven Projects
Page 71: API Platform and Symfony: a Framework for API-driven Projects

The StackReact, ES2015+, JSX

React Router: client-side routing library

Redux: extensible container to manage the states of the app

Redux Form: forms

Redux Thunk: async actions (AJAX requests)

Optional: Twitter Bootstrap

Page 72: API Platform and Symfony: a Framework for API-driven Projects

Other SkeletonsReact Native: master branch (@mysiar)

TypeScript definitions: master branch (@soyuka)

Your preferred technology: Pull Requests very appreciated!

Angular: community (momenttech/lysis)

Vue.js: api-platform/client-generator#35 (@alOneh)

Page 73: API Platform and Symfony: a Framework for API-driven Projects

React Native

$ generate-api-platform-client \ http://localhost src/ \ —g react-native

Page 74: API Platform and Symfony: a Framework for API-driven Projects

Deploy in Clouds

Page 75: API Platform and Symfony: a Framework for API-driven Projects

Kubernetes & HelmK8S: « Production-Grade Container Orchestration », by Google

Powers Google Kubernetes Engine and Azure Container ServiceHelm: official K8S package manager (like APT or Homebrew), by MicrosoftFree software

Page 76: API Platform and Symfony: a Framework for API-driven Projects

Deploy in the CloudA Helm chart is provided with API Platform

# …Build and push the Docker images… # …Connect to your Kubernetes cluster…

$ helm install ./api/helm/api --name api

The project is deployed, managed, and scale!

Page 77: API Platform and Symfony: a Framework for API-driven Projects

One More Thing…

Page 78: API Platform and Symfony: a Framework for API-driven Projects

GraphQL Support

$ composer req webonyx/graphql-php

api-platform/core@master (@alanpoulain & @raoulclais)

Page 79: API Platform and Symfony: a Framework for API-driven Projects
Page 80: API Platform and Symfony: a Framework for API-driven Projects

Thanks!Any questions?

api-platform/api-platform @ApiPlatform

https://api-platform.com