Zend Expressive Workshop
By:
Adam Culp
Twitter: @adamculp
https://joind.in/talk/ec545
2
Zend Expressive Workshop
●
About me
– OSS Contributor
– PHP Certified
– Zend Certification Advisory Board
– PHP-Fig voting member (IBM i Toolkit)
– Consultant at Zend Technologies
– Organizer SoFloPHP (South Florida)
– Organizer SunshinePHP (Miami)
– Long distance (ultra) runner
– Photography Enthusiast
– Judo Black Belt Instructor
3
Zend Expressive Workshop
●
About me
– OSS Contributor
– PHP Certified
– Zend Certification Advisory Board
– PHP-Fig voting member (IBM i Toolkit)
– Consultant at Zend Technologies
– Organizer SoFloPHP (South Florida)
– Organizer SunshinePHP (Miami)
– Long distance (ultra) runner
– Photography Enthusiast
– Judo Black Belt Instructor
PHP Ninja!!!
4
Zend Expressive Workshop
●
I Help Build The Web
5
Zend Expressive Workshop
●
Frameworks Suck
– Complicated
●
Routing
●
Databases
●
Connectivity
●
Communication (HTTP, API)
●
Information Container
●
GUI (html, javascript, templates, CSS,)
●
Errors and Exceptions
●
Validation and Cleansing Data
●
State
6
Zend Expressive Workshop
●
Frameworks Web Applications Suck
– Complicated
●
Routing
●
Databases
●
Connectivity
●
Communication (HTTP, API)
●
Information Container
●
GUI (html, javascript, templates, CSS,)
●
Errors and Exceptions
●
Validation and Cleansing Data
●
State
7
Zend Expressive Workshop
●
Buzzword Bingo
– We will mention many buzzwords, but...
8
Zend Expressive Workshop
●
Microservice
– All the buzz is “microservices”.
– ...complex applications are composed of small, independent processes
communicating with each other using language-agnostic APIs. These
services are small building blocks, highly decoupled and focused on doing
a small task, facilitating a modular approach to system-building. –
Wikipedia
9
Zend Expressive Workshop
●
But in PHP...
– How to keep microservices light?
– Microservices shouldn’t be heavy
I’m a
Microservice!!!
10
Zend Expressive Workshop
●
Full Stack Frameworks Suck
– Heavy and bloated
– “Kitchen Sink”
– “You don’t have to use everything, but its there...”
11
Zend Expressive Workshop
●
Need For Speed
– What does a microservice “need”?
●
HTTP message layer
●
Routing capabilities
●
Dependency injection
– Testable
– Swappable pieces
●
Templating
– Optional (APIs may not need it, except documentation)
12
Zend Expressive Workshop
●
PHP Ecosystem Facilitators
– PHP 7
– Microframeworks
– Libraries
– Components
– Containers
– Composer
13
Zend Expressive Workshop
●
All The Things!!!
– So many tools:
Monolog
Whoops
Flysystem
IBMiToolkit
OAuth2 Server
https://github.com/ziadoz/awesome-php
14
Zend Expressive Workshop
●
Communication Sucks
– Say what!?!
Monolog
Whoops
Flysystem
IBMiToolkit
OAuth2 Server
15
Zend Expressive Workshop
●
PSR-7 Doesn’t Suck
– Part of PHP-Fig.org recommendations
– HTTP Messages
●
Request from client to server
●
Response from server to client
– Interfaces
●
PsrHttpMessageMessageInterface
– PsrHttpMessageRequestInterface
●
PsrHttpMessageServerRequestInterface
– PsrHttpMessageResponseInterface
●
PsrHttpMessageStreamInterface
●
PsrHttpMessageUploadFileInterface
●
PsrHttpMessageUriInterface
16
Zend Expressive Workshop
●
Middleware
– ...Middleware makes it easier for software developers to implement
communication and input/output, so they can focus on the specific
purpose of their application. – Wikipedia
– Lighter applications (only what is needed)
– Composed of layers
17
Zend Expressive Workshop
●
Zend Expressive
– Microframework built around middleware
– Very lean runtime
– Built to consume PSR-7
– Use for building:
●
APIs
●
Web applications
●
Single page sites
– Choose your own stack
– Great documentation
●
https://zendframework.github.io/zend-expressive/
18
Zend Expressive Workshop
●
Composer Install Script
– Done “right” from the start
19
Zend Expressive Workshop
●
Composer Install Script
20
Zend Expressive Workshop
●
Composer Install Script
– Minimal skeleton or full*?
●
With or without samples
21
Zend Expressive Workshop
●
Composer Install Script
– Router options
●
Aura.Router
●
FastRoute*
●
Zend Router
22
Zend Expressive Workshop
●
Composer Install Script
– Container options: (container interop)
●
Aura.Di
●
Pimple
●
Zend ServiceManager*
23
Zend Expressive Workshop
●
Composer Install Script
– Template engine options:
●
Plates
●
Twig
●
Zend View
●
None*
24
Zend Expressive Workshop
●
Composer Install Script
– Error handler options:
●
Whoops*
●
None
25
Zend Expressive Workshop
●
Lab 01 – Install Zend Expressive
– From within the VM install Zend Expressive
●
At ‘/home/vagrant/workspace/’ delete the ‘expressive’ folder
●
Composer is globally installed in the VM, enabling easy project
creation. (stick to the defaults)
$ composer create-project zendframework/zend-expressive-
skeleton expressive
●
Verify that Zend Expressive Skeleton was properly installed.
http://localhost then click on the Expressive link.→
26
Zend Expressive Workshop
●
Skeleton Application
27
Zend Expressive Workshop
●
Structure
– Folder structure of Zend Expressive Skeleton
28
Zend Expressive Workshop
●
Not MVC
– Files and structure focused on Actions
29
Zend Expressive Workshop
●
Middleware Addition Approaches
– Currently uses a config-driven approach to creating/using middleware
●
Middleware added to services through configuration
– With version 1.1 of Zend Expressive the “recommended” will be
programmatic/explicit approach versus config-driven.
●
Middleware information driven by pipes
●
More on this later
– In this workshop the config-driven approach is used in examples
30
Zend Expressive Workshop
●
The Flow
31
Zend Expressive Workshop
●
Initial File
– Front controller
(/public/index.php)
32
Zend Expressive Workshop
●
Container Creation
– We specified Zend ServiceManager
(/config/container.php)
33
Zend Expressive Workshop
●
Load Configs
(/config/config.php)
34
Zend Expressive Workshop
●
Load Dependencies
– Items to be called as middleware in routes.
(/config/autoload/routes.global.php)
35
Zend Expressive Workshop
●
Load Routes
– Matches path to middleware (Dependencies shown earlier)
(/config/autoload/routes.global.php cont’d)
36
Zend Expressive Workshop
●
Ping Action Anatomy
– Creates raw JSON response
(/src/App/Action/PingAction.php)
37
Zend Expressive Workshop
●
JSON Response
– Created by action
38
Zend Expressive Workshop
●
Lab 02 – REST Test using HTTPie
– Within the VM
●
We will use HTTPie from the command line instead of raw cURL to
make requests.
●
Make a request to the existing ping action we analyzed:
$ http http://expressive/api/ping
●
If doing this from the host browser the URL would be different:
$ http http://expressive:8081/api/ping
●
Observe the response:
– Note the Header information
– Note the json response object
39
Zend Expressive Workshop
●
Lab 02 – REST Test using HTTPie (cont’d)
– Within the VM
●
Observe the response:
– Note the Header information
– Note the json response object
40
Zend Expressive Workshop
●
Let’s Create a Middleware!!!
41
Zend Expressive Workshop
●
Header Middleware
– Create class for new middleware (or include someone else’s)
42
Zend Expressive Workshop
●
Header Middleware
– The class to include the very important header
(/src/App/Middleware/TheClacksMiddleware.php)
43
Zend Expressive Workshop
●
Header Middleware
– Add the middleware to the container
– Set it to always be included
(/config/autoload/middleware-pipeline.global.php)
44
Zend Expressive Workshop
●
Header Middleware
– Header for every call now carries our important message
45
Zend Expressive Workshop
●
Lab 03 – Create a Middleware
– Create middleware to add content into ALL response headers
●
Add an appropriately named middleware class. (Example:
TheClacksMiddleware)
– Define the namespace (Example: ‘AppMiddleware’)
– Use PsrHttpMessageResponseInterface and
ServerRequestInterface.
– Return the response withHeader.
●
Add the new middleware into our middleware services. Remember we
want it to ALL responses.
●
Verify
NOTE: Refer to the expressive-final application if you need hints
46
Zend Expressive Workshop
●
Let’s Create a Database Connected Middleware!!!
●
With Zend Db
47
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– First we need a database connection.
●
Will use Zend-Db for this example, but could be anything.
●
Composer to the rescue!
48
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Specify adapter (provided by Zend/Db/ConfigProvider() in this case)
(/config/autoload/db.global.php)
49
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Provide local/instance configuration
● This would be driver and credentials
● (credentials not needed with sqlite)
(/config/autoload/db.local.php)
50
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Create the action (view 1 of 2 - constructor)
(/src/App/Action/UserListAction.php)
51
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Create the action (view 2 of 2 - __invoke method)
(/src/App/Action/UserListAction.php cont’d)
52
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Create a factory to pass items needed by the action
(/src/App/Action/UserListFactory.php)
53
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Add the new action to dependencies
(/config/autoload/routes.global.php)
54
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Add the new route to dependencies
(/config/autoload/routes.global.php cont’d)
55
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Create the view template
(/templates/app/user-list.phtml)
56
Zend Expressive Workshop
●
Database Connected Example With Zend Db
– Rejoice!
57
Zend Expressive Workshop
●
Lab 04 – Database Connected Middleware
– Create a User middleware allowing management of user records in a
database using Zend Db
●
Using Composer require dependency ‘zendframework/zend-db:2.8.*’
●
Create an autoload global config file to provide
Zend/Db/ConfigProvider
●
Create an autoload local config to provide a db container supplying
the location to the users.db Sqlite database in the /data directory
●
Add an appropriately named middleware class (Example:
UserListAction)
– Define the namespace (Example: ‘AppAction’)
– Use PsrHttpMessageResponseInterface, ServerRequestInterface,
ZendDiactorosResponseHtmlResponse,
ZendExpressiveTemplate, and ZendDbAdapterAdapter.
– Define $template and $adapter fields for those objects
58
Zend Expressive Workshop
●
Lab 04 – Database Connected Middleware (Cont’d)
– Create a User middleware (Cont’d
●
Add a middleware class (Cont’d)
– Add a constructor to receive/set $template and $adapter
●
Typehint $template with TemplateTemplateRendererInterface
– Add an invoke method leveraging ServerRequestInterface,
ResponseInterface, and $next as callable.
– Using the Zend Db adapter create the query for Sqlite.
●
For Sqlite this involves defining a statement, then executing
– Return the HtmlResponse rendering the view template.
●
Add a factory class to prepare the items needed by the Action just
created
– Use InteropContainerContainerInterface,
ZendExpressiveTemplateTemplateRendererInterface, and
ZendDbAdapterAdapterInterface.
59
Zend Expressive Workshop
●
Lab 04 – Database Connected Middleware (Cont’d)
– Create a User middleware (Cont’d
●
Add a factory class (Cont’d)
– Define the namespace (Example: ‘AppAction’)
– In the invoke() method typehint the $container argument using
ContainerInterface.
– Gain the $template if the $container has the
TemplateRenderInterface.
– Gain the DB $adapter also from the $container using
AdapterInterface.
– Return an instantiation of the Action class created earlier by
passing the $template and $adapter.
●
Add the factory to the dependencies in the global routes.
●
Add a route to access the new middleware
●
Create a view template to display the user results.
60
Zend Expressive Workshop
●
Let’s Create Moar Middleware!!!
61
Zend Expressive Workshop
●
Lab 05 – Create Moar Middleware
– Create a uuid middleware to add content into all response headers
●
Using Composer add a dependency ‘ramsey/uuid’
●
Add an appropriately named middleware class. (Example:
UuidMiddleware)
– Define the namespace (Example: ‘AppMiddleware’)
– Use PsrHttpMessageResponseInterface, ServerRequestInterface,
and RamseyUuidUuid (and maybe
RamseyUuidExceptionUnsatisfiedDependencyException).
– Return a uuid in the response withHeader.
●
Add the new middleware into our middleware services. Remember we
want it to ALL responses.
●
Verify
62
Zend Expressive Workshop
●
Lab 05 – Create Moar Middleware (cont’d)
– Continuing… Create middleware to add response time to ALL response
headers
●
Add an appropriately named middleware class. (Example:
RequestTimeMiddleware)
– Define the namespace (Example: ‘AppMiddleware’)
– Use PsrHttpMessageResponseInterface and
ServerRequestInterface.
– Create code returning the time the request took
– Return the response withHeader.
●
Add the new middleware into our middleware services. Remember we
want it to ALL responses.
●
Verify
NOTE: Refer to the expressive-final application if you need hints
63
Zend Expressive Workshop
●
Let’s Create a Database Connected Middleware!!!
●
With Doctrine!!!
64
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– First we need a database connection.
●
Will use Doctrine DBAL for this example, but could be anything.
●
Composer to the rescue!
65
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Provide local/instance configuration
● This would be driver and credentials
● (credentials not needed with sqlite)
(/config/autoload/dbal.local.php)
66
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Create the action (view 1 of 2 - constructor)
(/src/App/Action/UserDbalListAction.php)
67
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Create the action (view 2 of 2 - __invoke method)
(/src/App/Action/UserDbalListAction.php cont’d)
68
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Create a factory to pass items needed by the action
(/src/App/Action/UserDbalListFactory.php)
69
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Add the new action to dependencies, as shown below for the previous
action, but with the new namespace for this example
(/config/autoload/routes.global.php)
70
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Add the new route to dependencies
(/config/autoload/routes.global.php)
71
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Create the view template
(/templates/app/user-dbal-list.phtml)
72
Zend Expressive Workshop
●
Database Connected Example With Doctrine
– Rejoice!
73
Zend Expressive Workshop
●
Lab 06 – Database Connected Middleware
– Create a User middleware allowing management of user records in a
database using Doctrine Dbal
●
Using Composer require dependency ‘doctrinedbal:2.5.*’
●
Create an autoload local config to provide a doctrine-connection
container supplying the location to the users.db sqlite database in
the /data directory
●
Add an appropriately named middleware class (Example:
UserDbalListAction)
– Define the namespace (Example: ‘AppAction’)
– Use PsrHttpMessageResponseInterface, ServerRequestInterface,
ZendDiactorosResponseHtmlResponse, and
ZendExpressiveTemplate.
– Define $template and $connection fields for those objects
74
Zend Expressive Workshop
●
Lab 06 – Database Connected Middleware (Cont’d)
– Create a User middleware (Cont’d
●
Add a middleware class (Cont’d)
– Add a constructor to receive/set $template and $connection
●
Typehint $template with TemplateTemplateRendererInterface
– Add an invoke method leveraging ServerRequestInterface,
ResponseInterface, and $next as callable.
– Using the Doctrine $connection create the query for Sqlite.
– Return the HtmlResponse rendering the view template.
●
Add a factory class to prepare the items needed by the Action just
created
– Use InteropContainerContainerInterface,
ZendExpressiveTemplateTemplateRendererInterface, and
DoctrineDBALDriverManager.
75
Zend Expressive Workshop
●
Lab 06 – Database Connected Middleware (Cont’d)
– Create a User middleware (Cont’d
●
Add a factory class (Cont’d)
– Define the namespace (Example: ‘AppAction’)
– In the invoke() method typehint the $container argument using
ContainerInterface.
– Gain the $template if the $container has the
TemplateRenderInterface.
– Define the DB $credentials also from the $container and kick off
Doctrine to return the $connection to users for the view to use.
– Return an instantiation of the Action class created earlier by
passing the $template and $connection.
●
Add the factory to the dependencies in the global routes.
●
Add a route to access the new middleware
●
Create a view template to display the user results.
76
Zend Expressive Workshop
●
Let’s Use Programmatic!!!
77
Zend Expressive Workshop
●
Zend Expressive Skeleton Programmatic
– Version 1.1 of Zend Expressive “recommended” approach to adding more
middleware will be with a programmatic/explicit approach.
●
In Github the repo for expressive-final has an additional branch
(name: programmatic) created by Matthew Weier O’Phinney, from the
Zend Expressive team, showing the programmatic approach to
everything in this workshop.
●
https://github.com/adamculp/expressive-workshop
78
Zend Expressive Workshop
●
Resources
– Zend Expressive Site - http://zendframework.github.io/zend-expressive/
– MasterZendFramework - http://www.masterzendframework.com
– Oscar Otero’s list https://github.com/oscarotero/psr7-middlewares
– This github repo https://github.com/adamculp/expressive-workshop
– Slides - http://www.slideshare.net/adamculp/zend-expressive-workshop
– Code used for the workshop - https://github.com/adamculp/expressive-
workshop
– More to come!
79
Zend Expressive Workshop
●
With Zend Expressive:
– Easy to build middleware
– Lightweight, add what is really needed
– Fast – no extra load
– Microservices in PHP are better
80
Zend Expressive Workshop
●
Give Zend Expressive a Try...Today!!!
– https://zendframework.github.io/zend-expressive/
●
Thank you!
●
Code at: https://github.com/adamculp/expressive-blastoff
●
Please rate at: https://joind.in/talk/ec545
Adam Culp
http://www.rungeekradio.com
http://www.geekyboy.com
Twitter @adamculp

Zend expressive workshop

  • 1.
    Zend Expressive Workshop By: AdamCulp Twitter: @adamculp https://joind.in/talk/ec545
  • 2.
    2 Zend Expressive Workshop ● Aboutme – OSS Contributor – PHP Certified – Zend Certification Advisory Board – PHP-Fig voting member (IBM i Toolkit) – Consultant at Zend Technologies – Organizer SoFloPHP (South Florida) – Organizer SunshinePHP (Miami) – Long distance (ultra) runner – Photography Enthusiast – Judo Black Belt Instructor
  • 3.
    3 Zend Expressive Workshop ● Aboutme – OSS Contributor – PHP Certified – Zend Certification Advisory Board – PHP-Fig voting member (IBM i Toolkit) – Consultant at Zend Technologies – Organizer SoFloPHP (South Florida) – Organizer SunshinePHP (Miami) – Long distance (ultra) runner – Photography Enthusiast – Judo Black Belt Instructor PHP Ninja!!!
  • 4.
  • 5.
    5 Zend Expressive Workshop ● FrameworksSuck – Complicated ● Routing ● Databases ● Connectivity ● Communication (HTTP, API) ● Information Container ● GUI (html, javascript, templates, CSS,) ● Errors and Exceptions ● Validation and Cleansing Data ● State
  • 6.
    6 Zend Expressive Workshop ● FrameworksWeb Applications Suck – Complicated ● Routing ● Databases ● Connectivity ● Communication (HTTP, API) ● Information Container ● GUI (html, javascript, templates, CSS,) ● Errors and Exceptions ● Validation and Cleansing Data ● State
  • 7.
    7 Zend Expressive Workshop ● BuzzwordBingo – We will mention many buzzwords, but...
  • 8.
    8 Zend Expressive Workshop ● Microservice –All the buzz is “microservices”. – ...complex applications are composed of small, independent processes communicating with each other using language-agnostic APIs. These services are small building blocks, highly decoupled and focused on doing a small task, facilitating a modular approach to system-building. – Wikipedia
  • 9.
    9 Zend Expressive Workshop ● Butin PHP... – How to keep microservices light? – Microservices shouldn’t be heavy I’m a Microservice!!!
  • 10.
    10 Zend Expressive Workshop ● FullStack Frameworks Suck – Heavy and bloated – “Kitchen Sink” – “You don’t have to use everything, but its there...”
  • 11.
    11 Zend Expressive Workshop ● NeedFor Speed – What does a microservice “need”? ● HTTP message layer ● Routing capabilities ● Dependency injection – Testable – Swappable pieces ● Templating – Optional (APIs may not need it, except documentation)
  • 12.
    12 Zend Expressive Workshop ● PHPEcosystem Facilitators – PHP 7 – Microframeworks – Libraries – Components – Containers – Composer
  • 13.
    13 Zend Expressive Workshop ● AllThe Things!!! – So many tools: Monolog Whoops Flysystem IBMiToolkit OAuth2 Server https://github.com/ziadoz/awesome-php
  • 14.
    14 Zend Expressive Workshop ● CommunicationSucks – Say what!?! Monolog Whoops Flysystem IBMiToolkit OAuth2 Server
  • 15.
    15 Zend Expressive Workshop ● PSR-7Doesn’t Suck – Part of PHP-Fig.org recommendations – HTTP Messages ● Request from client to server ● Response from server to client – Interfaces ● PsrHttpMessageMessageInterface – PsrHttpMessageRequestInterface ● PsrHttpMessageServerRequestInterface – PsrHttpMessageResponseInterface ● PsrHttpMessageStreamInterface ● PsrHttpMessageUploadFileInterface ● PsrHttpMessageUriInterface
  • 16.
    16 Zend Expressive Workshop ● Middleware –...Middleware makes it easier for software developers to implement communication and input/output, so they can focus on the specific purpose of their application. – Wikipedia – Lighter applications (only what is needed) – Composed of layers
  • 17.
    17 Zend Expressive Workshop ● ZendExpressive – Microframework built around middleware – Very lean runtime – Built to consume PSR-7 – Use for building: ● APIs ● Web applications ● Single page sites – Choose your own stack – Great documentation ● https://zendframework.github.io/zend-expressive/
  • 18.
    18 Zend Expressive Workshop ● ComposerInstall Script – Done “right” from the start
  • 19.
  • 20.
    20 Zend Expressive Workshop ● ComposerInstall Script – Minimal skeleton or full*? ● With or without samples
  • 21.
    21 Zend Expressive Workshop ● ComposerInstall Script – Router options ● Aura.Router ● FastRoute* ● Zend Router
  • 22.
    22 Zend Expressive Workshop ● ComposerInstall Script – Container options: (container interop) ● Aura.Di ● Pimple ● Zend ServiceManager*
  • 23.
    23 Zend Expressive Workshop ● ComposerInstall Script – Template engine options: ● Plates ● Twig ● Zend View ● None*
  • 24.
    24 Zend Expressive Workshop ● ComposerInstall Script – Error handler options: ● Whoops* ● None
  • 25.
    25 Zend Expressive Workshop ● Lab01 – Install Zend Expressive – From within the VM install Zend Expressive ● At ‘/home/vagrant/workspace/’ delete the ‘expressive’ folder ● Composer is globally installed in the VM, enabling easy project creation. (stick to the defaults) $ composer create-project zendframework/zend-expressive- skeleton expressive ● Verify that Zend Expressive Skeleton was properly installed. http://localhost then click on the Expressive link.→
  • 26.
  • 27.
    27 Zend Expressive Workshop ● Structure –Folder structure of Zend Expressive Skeleton
  • 28.
    28 Zend Expressive Workshop ● NotMVC – Files and structure focused on Actions
  • 29.
    29 Zend Expressive Workshop ● MiddlewareAddition Approaches – Currently uses a config-driven approach to creating/using middleware ● Middleware added to services through configuration – With version 1.1 of Zend Expressive the “recommended” will be programmatic/explicit approach versus config-driven. ● Middleware information driven by pipes ● More on this later – In this workshop the config-driven approach is used in examples
  • 30.
  • 31.
    31 Zend Expressive Workshop ● InitialFile – Front controller (/public/index.php)
  • 32.
    32 Zend Expressive Workshop ● ContainerCreation – We specified Zend ServiceManager (/config/container.php)
  • 33.
    33 Zend Expressive Workshop ● LoadConfigs (/config/config.php)
  • 34.
    34 Zend Expressive Workshop ● LoadDependencies – Items to be called as middleware in routes. (/config/autoload/routes.global.php)
  • 35.
    35 Zend Expressive Workshop ● LoadRoutes – Matches path to middleware (Dependencies shown earlier) (/config/autoload/routes.global.php cont’d)
  • 36.
    36 Zend Expressive Workshop ● PingAction Anatomy – Creates raw JSON response (/src/App/Action/PingAction.php)
  • 37.
    37 Zend Expressive Workshop ● JSONResponse – Created by action
  • 38.
    38 Zend Expressive Workshop ● Lab02 – REST Test using HTTPie – Within the VM ● We will use HTTPie from the command line instead of raw cURL to make requests. ● Make a request to the existing ping action we analyzed: $ http http://expressive/api/ping ● If doing this from the host browser the URL would be different: $ http http://expressive:8081/api/ping ● Observe the response: – Note the Header information – Note the json response object
  • 39.
    39 Zend Expressive Workshop ● Lab02 – REST Test using HTTPie (cont’d) – Within the VM ● Observe the response: – Note the Header information – Note the json response object
  • 40.
  • 41.
    41 Zend Expressive Workshop ● HeaderMiddleware – Create class for new middleware (or include someone else’s)
  • 42.
    42 Zend Expressive Workshop ● HeaderMiddleware – The class to include the very important header (/src/App/Middleware/TheClacksMiddleware.php)
  • 43.
    43 Zend Expressive Workshop ● HeaderMiddleware – Add the middleware to the container – Set it to always be included (/config/autoload/middleware-pipeline.global.php)
  • 44.
    44 Zend Expressive Workshop ● HeaderMiddleware – Header for every call now carries our important message
  • 45.
    45 Zend Expressive Workshop ● Lab03 – Create a Middleware – Create middleware to add content into ALL response headers ● Add an appropriately named middleware class. (Example: TheClacksMiddleware) – Define the namespace (Example: ‘AppMiddleware’) – Use PsrHttpMessageResponseInterface and ServerRequestInterface. – Return the response withHeader. ● Add the new middleware into our middleware services. Remember we want it to ALL responses. ● Verify NOTE: Refer to the expressive-final application if you need hints
  • 46.
    46 Zend Expressive Workshop ● Let’sCreate a Database Connected Middleware!!! ● With Zend Db
  • 47.
    47 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – First we need a database connection. ● Will use Zend-Db for this example, but could be anything. ● Composer to the rescue!
  • 48.
    48 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Specify adapter (provided by Zend/Db/ConfigProvider() in this case) (/config/autoload/db.global.php)
  • 49.
    49 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Provide local/instance configuration ● This would be driver and credentials ● (credentials not needed with sqlite) (/config/autoload/db.local.php)
  • 50.
    50 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Create the action (view 1 of 2 - constructor) (/src/App/Action/UserListAction.php)
  • 51.
    51 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Create the action (view 2 of 2 - __invoke method) (/src/App/Action/UserListAction.php cont’d)
  • 52.
    52 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Create a factory to pass items needed by the action (/src/App/Action/UserListFactory.php)
  • 53.
    53 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Add the new action to dependencies (/config/autoload/routes.global.php)
  • 54.
    54 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Add the new route to dependencies (/config/autoload/routes.global.php cont’d)
  • 55.
    55 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Create the view template (/templates/app/user-list.phtml)
  • 56.
    56 Zend Expressive Workshop ● DatabaseConnected Example With Zend Db – Rejoice!
  • 57.
    57 Zend Expressive Workshop ● Lab04 – Database Connected Middleware – Create a User middleware allowing management of user records in a database using Zend Db ● Using Composer require dependency ‘zendframework/zend-db:2.8.*’ ● Create an autoload global config file to provide Zend/Db/ConfigProvider ● Create an autoload local config to provide a db container supplying the location to the users.db Sqlite database in the /data directory ● Add an appropriately named middleware class (Example: UserListAction) – Define the namespace (Example: ‘AppAction’) – Use PsrHttpMessageResponseInterface, ServerRequestInterface, ZendDiactorosResponseHtmlResponse, ZendExpressiveTemplate, and ZendDbAdapterAdapter. – Define $template and $adapter fields for those objects
  • 58.
    58 Zend Expressive Workshop ● Lab04 – Database Connected Middleware (Cont’d) – Create a User middleware (Cont’d ● Add a middleware class (Cont’d) – Add a constructor to receive/set $template and $adapter ● Typehint $template with TemplateTemplateRendererInterface – Add an invoke method leveraging ServerRequestInterface, ResponseInterface, and $next as callable. – Using the Zend Db adapter create the query for Sqlite. ● For Sqlite this involves defining a statement, then executing – Return the HtmlResponse rendering the view template. ● Add a factory class to prepare the items needed by the Action just created – Use InteropContainerContainerInterface, ZendExpressiveTemplateTemplateRendererInterface, and ZendDbAdapterAdapterInterface.
  • 59.
    59 Zend Expressive Workshop ● Lab04 – Database Connected Middleware (Cont’d) – Create a User middleware (Cont’d ● Add a factory class (Cont’d) – Define the namespace (Example: ‘AppAction’) – In the invoke() method typehint the $container argument using ContainerInterface. – Gain the $template if the $container has the TemplateRenderInterface. – Gain the DB $adapter also from the $container using AdapterInterface. – Return an instantiation of the Action class created earlier by passing the $template and $adapter. ● Add the factory to the dependencies in the global routes. ● Add a route to access the new middleware ● Create a view template to display the user results.
  • 60.
    60 Zend Expressive Workshop ● Let’sCreate Moar Middleware!!!
  • 61.
    61 Zend Expressive Workshop ● Lab05 – Create Moar Middleware – Create a uuid middleware to add content into all response headers ● Using Composer add a dependency ‘ramsey/uuid’ ● Add an appropriately named middleware class. (Example: UuidMiddleware) – Define the namespace (Example: ‘AppMiddleware’) – Use PsrHttpMessageResponseInterface, ServerRequestInterface, and RamseyUuidUuid (and maybe RamseyUuidExceptionUnsatisfiedDependencyException). – Return a uuid in the response withHeader. ● Add the new middleware into our middleware services. Remember we want it to ALL responses. ● Verify
  • 62.
    62 Zend Expressive Workshop ● Lab05 – Create Moar Middleware (cont’d) – Continuing… Create middleware to add response time to ALL response headers ● Add an appropriately named middleware class. (Example: RequestTimeMiddleware) – Define the namespace (Example: ‘AppMiddleware’) – Use PsrHttpMessageResponseInterface and ServerRequestInterface. – Create code returning the time the request took – Return the response withHeader. ● Add the new middleware into our middleware services. Remember we want it to ALL responses. ● Verify NOTE: Refer to the expressive-final application if you need hints
  • 63.
    63 Zend Expressive Workshop ● Let’sCreate a Database Connected Middleware!!! ● With Doctrine!!!
  • 64.
    64 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – First we need a database connection. ● Will use Doctrine DBAL for this example, but could be anything. ● Composer to the rescue!
  • 65.
    65 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Provide local/instance configuration ● This would be driver and credentials ● (credentials not needed with sqlite) (/config/autoload/dbal.local.php)
  • 66.
    66 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Create the action (view 1 of 2 - constructor) (/src/App/Action/UserDbalListAction.php)
  • 67.
    67 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Create the action (view 2 of 2 - __invoke method) (/src/App/Action/UserDbalListAction.php cont’d)
  • 68.
    68 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Create a factory to pass items needed by the action (/src/App/Action/UserDbalListFactory.php)
  • 69.
    69 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Add the new action to dependencies, as shown below for the previous action, but with the new namespace for this example (/config/autoload/routes.global.php)
  • 70.
    70 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Add the new route to dependencies (/config/autoload/routes.global.php)
  • 71.
    71 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Create the view template (/templates/app/user-dbal-list.phtml)
  • 72.
    72 Zend Expressive Workshop ● DatabaseConnected Example With Doctrine – Rejoice!
  • 73.
    73 Zend Expressive Workshop ● Lab06 – Database Connected Middleware – Create a User middleware allowing management of user records in a database using Doctrine Dbal ● Using Composer require dependency ‘doctrinedbal:2.5.*’ ● Create an autoload local config to provide a doctrine-connection container supplying the location to the users.db sqlite database in the /data directory ● Add an appropriately named middleware class (Example: UserDbalListAction) – Define the namespace (Example: ‘AppAction’) – Use PsrHttpMessageResponseInterface, ServerRequestInterface, ZendDiactorosResponseHtmlResponse, and ZendExpressiveTemplate. – Define $template and $connection fields for those objects
  • 74.
    74 Zend Expressive Workshop ● Lab06 – Database Connected Middleware (Cont’d) – Create a User middleware (Cont’d ● Add a middleware class (Cont’d) – Add a constructor to receive/set $template and $connection ● Typehint $template with TemplateTemplateRendererInterface – Add an invoke method leveraging ServerRequestInterface, ResponseInterface, and $next as callable. – Using the Doctrine $connection create the query for Sqlite. – Return the HtmlResponse rendering the view template. ● Add a factory class to prepare the items needed by the Action just created – Use InteropContainerContainerInterface, ZendExpressiveTemplateTemplateRendererInterface, and DoctrineDBALDriverManager.
  • 75.
    75 Zend Expressive Workshop ● Lab06 – Database Connected Middleware (Cont’d) – Create a User middleware (Cont’d ● Add a factory class (Cont’d) – Define the namespace (Example: ‘AppAction’) – In the invoke() method typehint the $container argument using ContainerInterface. – Gain the $template if the $container has the TemplateRenderInterface. – Define the DB $credentials also from the $container and kick off Doctrine to return the $connection to users for the view to use. – Return an instantiation of the Action class created earlier by passing the $template and $connection. ● Add the factory to the dependencies in the global routes. ● Add a route to access the new middleware ● Create a view template to display the user results.
  • 76.
  • 77.
    77 Zend Expressive Workshop ● ZendExpressive Skeleton Programmatic – Version 1.1 of Zend Expressive “recommended” approach to adding more middleware will be with a programmatic/explicit approach. ● In Github the repo for expressive-final has an additional branch (name: programmatic) created by Matthew Weier O’Phinney, from the Zend Expressive team, showing the programmatic approach to everything in this workshop. ● https://github.com/adamculp/expressive-workshop
  • 78.
    78 Zend Expressive Workshop ● Resources –Zend Expressive Site - http://zendframework.github.io/zend-expressive/ – MasterZendFramework - http://www.masterzendframework.com – Oscar Otero’s list https://github.com/oscarotero/psr7-middlewares – This github repo https://github.com/adamculp/expressive-workshop – Slides - http://www.slideshare.net/adamculp/zend-expressive-workshop – Code used for the workshop - https://github.com/adamculp/expressive- workshop – More to come!
  • 79.
    79 Zend Expressive Workshop ● WithZend Expressive: – Easy to build middleware – Lightweight, add what is really needed – Fast – no extra load – Microservices in PHP are better
  • 80.
    80 Zend Expressive Workshop ● GiveZend Expressive a Try...Today!!! – https://zendframework.github.io/zend-expressive/
  • 81.
    ● Thank you! ● Code at:https://github.com/adamculp/expressive-blastoff ● Please rate at: https://joind.in/talk/ec545 Adam Culp http://www.rungeekradio.com http://www.geekyboy.com Twitter @adamculp