Zend\Expressive ist das neue PSR-7 kompatible Middleware-Framework aus dem Zend Framework 3, mit dem Sie eigene Web- und REST-Anwendungen mit PHP implementieren können. In dieser Session erhalten Sie einen Überblick über die grundlegende Theorie sowie die Möglichkeiten von Zend\Expressive und erfahren auch die Unterschiede zum klassischen MVC-Ansatz.
4. Ralf EggertRalf Eggert 44 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Framework Silos von 2006 bis 2015
5. Ralf EggertRalf Eggert 55 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Ende der Framework Silos seit 2016
6. Ralf EggertRalf Eggert 66 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Was ist die PHP-FIG?
7. Ralf EggertRalf Eggert 77 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Was ist der PSR-7?
8. Ralf EggertRalf Eggert 88 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Was ist der PSR-15?
9. Ralf EggertRalf Eggert 99 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Klassischer HTTP Request
CLIENT WEBSERVER
HTTP
REQUEST
HTTP
RESPONSE
10. Ralf EggertRalf Eggert 1010 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Middleware-Request
HTTP
Request
HTTP
Response
Middleware
11. Ralf EggertRalf Eggert 1111 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Middleware-Pipeline
HTTP
Request
HTTP
Response
Routing
Middleware
Authorization
Middleware
Dispatching
Middleware
12. Ralf EggertRalf Eggert 1212 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Middleware-Aktionen
HTTP
Request
HTTP
Response
Routing
Middleware
Action
Middleware
Authorization
Middleware
Dispatching
Middleware
13. Ralf EggertRalf Eggert 1313 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Zend Framework Komponenten
ZEND
DIACTOROS
ZENDSTRATIGILITY
ZENDEXPRESSIVE
HTTP MESSAGES /PSR-7
MIDDLEWARE / PSR-15
MIDDLEWARE
APPLICATIONS
14. Ralf EggertRalf Eggert 1414 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive Komponenten
Router DI Container Template Renderer Error Handler
Aura.Router
FastRoute
ZendRouter
Weitere Router
Aura.DI
Pimple-interop
Zend
ServiceManager
Weitere
DI Container
Plates
Twig
ZendView
Weitere
Template-Engines
Whoops
Weitere
Error-Handler
15. Ralf EggertRalf Eggert 1515 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Performance Messdaten
Gemessen im April 2016 mit der ZendExpressive Skeleton 1.0.1
AD = Aura.DI, AR = Aura.Router, FR = FastRoute, ZR = ZendRouter, ZS = ZendServiceManager, ZV = ZendView
Laufzeit (ms) 31,8 106,5 43,8 31,9 103,8 44,9 42,7 117,2 56,1 35,6 31,3
Router FR FR FR AR AR AR ZR ZR ZR FR FR
DI Container ZS ZS ZS ZS ZS ZS ZS ZS ZS AD Pimple
Renderer Plates Twig ZV Plates Twig ZV Plates Twig ZV Plates Plates
16. Ralf EggertRalf Eggert 1616 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Performance Erkenntnisse
AD = Aura.DI, AR = Aura.Router, FR = FastRoute, ZR = ZendRouter, ZS = ZendServiceManager, ZV = ZendView
AR FR
ZR
ROUTER
Plates
Twig
ZV
RENDERER
AD Pimple ZS
DI CONTAINER
17. Ralf EggertRalf Eggert 1717 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Performance Fazit
AD = Aura.DI, AR = Aura.Router, FR = FastRoute, ZR = ZendRouter, ZS = ZendServiceManager, ZV = ZendView
FR
Schnellste
Variante
PlatesPimple
Traue keiner Statistik, die du nicht selber gefälscht hast! ;-)
ZR
ZF
Variante
ZVZS
19. Ralf EggertRalf Eggert 1919 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive installieren I
20. Ralf EggertRalf Eggert 2020 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive installieren II
21. Ralf EggertRalf Eggert 2121 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive installieren III
22. Ralf EggertRalf Eggert 2222 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Skeleton Application
23. Ralf EggertRalf Eggert 2323 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Aufbau der Anwendung
bin
clear-config-cache.php
config
autoload
dependencies.global.php
dependencies.local.php.dist
local.php.dist
router.global.php
templates.global.php
zend-expressive.global.php
config.php
container.php
development.config.php.dist
pipeline.php
routes.php
data
cache
db
module
App
public
.htaccess
index.php
test
AppTest
...
vendor
bin
composer
zendframework
...
autoload.php
composer.json
composer.lock
26. Ralf EggertRalf Eggert 2626 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Modularität I
Modul Customer
Actions
Konfiguration
Templates
Formulare
Repositories
Entitäten
Storages
Services
Routing
Input-Filter
View-Helper
Paginierung
Navigation
27. Ralf EggertRalf Eggert 2727 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Modularität II
Modul CustomerApp Modul CustomerDomain
Action
Konfiguration
Templates
Formulare
Konfiguration
Repository
Entitäten
Storage
Services
Routing
Input-Filter
View-Helper
Paginierung
Navigation
28. Ralf EggertRalf Eggert 2828 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Modularität III
Modul
Customer
MwApp
Modul
Customer
Domain
Modul
Customer
Presentation
Modul
Customer
Console
Modul
Customer
Rest
Modul
Customer
MvcApp
29. Ralf EggertRalf Eggert 2929 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Modularität IV
Modul
Customer
MwApp
Modul
Customer
Domain
Modul
Customer
Presentation
Modul
Customer
Console
Modul
Customer
Rest
Modul
Customer
MvcApp
30. Ralf EggertRalf Eggert 3030 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Schichtenmodell (frei nach DDD)
Repository DatenbankAction
Presentation Layer Domain Layer Infrastructure LayerApplication Layer
Formular
33. Ralf EggertRalf Eggert 3333 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Ausführung Middleware-Aktion
HTTP
Request
HTTP
Response
Routing
Middleware
Action
Middleware
Authorization
Middleware
Dispatching
Middleware
34. Ralf EggertRalf Eggert 3434 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Beispiele für Action-Middleware
35. Ralf EggertRalf Eggert 3535 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Beispiel-Architektur
Routing
Action
Middleware
Application LayerPresentation Layer
Template
Factory RepositoryFormular
Domain Layer
36. Ralf EggertRalf Eggert 3636 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Action-Middleware für Anzeige
namespace CustomerAppAction;
use InteropHttpServerMiddlewareDelegateInterface;
use InteropHttpServerMiddlewareMiddlewareInterface
use CustomerDomainRepositoryCustomerRepository;
use PsrHttpMessageServerRequestInterface as Request;
use ZendDiactorosResponseHtmlResponse;
use ZendExpressiveTemplateTemplateRendererInterface;
class CustomerListAction implements MiddlewareInterface
{
public function process(
Request $request, DelegateInterface $delegate
) {
$customerList = $this->repository->getCustomerList();
$data = ['customerList' => $customerList];
return new HtmlResponse(
$this->renderer->render('customer-app::list', $data)
);
}
}
37. Ralf EggertRalf Eggert 3737 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Routing für Action-Middleware
use CustomerAppActionCustomerListAction;
use CustomerAppActionCustomerShowAction;
use InteropContainerContainerInterface;
use ZendExpressiveApplication;
/** @var ContainerInterface $container */
$container = require 'config/container.php';
$application = $container->get(Application::class);
$application->get(
'/customer',
CustomerListAction::class,
'customer-list'
);
$application->get(
'/customer/:id',
CustomerShowAction::class,
'customer-show'
)->setOptions(
['constraints' => ['id' => '[0-9]+']]
);
38. Ralf EggertRalf Eggert 3838 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Action-Middleware mit Formular
namespace CustomerAppAction;
/* ... */
class CustomerCreateHandleAction implements MiddlewareInterface
{
public function process(
Request $request, DelegateInterface $delegate
) {
$this->form->setData($request->getParsedBody());
if ($this->form->isValid()) {
$this->repository->saveCustomer($this->form->getData());
return new RedirectResponse(
$this->router->generateUri('customer-list')
);
}
return $delegate->process($request);
}
}
39. Ralf EggertRalf Eggert 3939 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Erweitertes Routing
use CustomerAppActionCustomerListAction;
use CustomerAppActionCustomerShowAction;
use InteropContainerContainerInterface;
use ZendExpressiveApplication;
$container = require 'config/container.php';
$application = $container->get(Application::class);
$application->get(
'/customer/create',
CustomerCreateFormAction::class,
'customer-create-form'
);
$application->post(
'/customer/create',
[
CustomerCreateHandleAction::class,
CustomerCreateFormAction::class,
],
'customer-create-handle'
);
40. Ralf EggertRalf Eggert 4040 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
RESTful Action-Middleware
namespace CustomerRestAction;
use InteropHttpServerMiddlewareDelegateInterface;
use InteropHttpServerMiddlewareMiddlewareInterface
use CustomerDomainRepositoryCustomerRepository;
use PsrHttpMessageServerRequestInterface as Request;
use ZendDiactorosResponseJsonResponse;
use ZendExpressiveTemplateTemplateRendererInterface;
class CustomerGetAction implements MiddlewareInterface
{
public function process(
Request $request, DelegateInterface $delegate
) {
$customerList = $this->repository->getCustomerList();
$data = ['customerList' => $customerList];
return new JsonResponse(data);
}
}
43. Ralf EggertRalf Eggert 4343 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Middleware-Pipeline
HTTP
Request
HTTP
Response
Routing
Middleware
Authorization
Middleware
Dispatching
Middleware
44. Ralf EggertRalf Eggert 4444 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Middleware-Pipeline
use I18nMiddlewareInternationalizationMiddleware;
use UserAuthMiddlewareAuthenticationMiddleware;
use UserAuthMiddlewareAuthorizationMiddleware;
use ZendExpressiveApplication;
use ZendExpressiveHelperServerUrlMiddleware;
use ZendExpressiveHelperUrlHelperMiddleware;
use ZendExpressiveMiddlewareNotFoundHandler;
use ZendStratigilityMiddlewareErrorHandler;
/** @var ContainerInterface $container */
$container = require 'config/container.php';
$application = $container->get(Application::class);
$application->pipe(ErrorHandler::class);
$application->pipe(ServerUrlMiddleware::class);
$application->pipeRoutingMiddleware();
$application->pipe(UrlHelperMiddleware::class);
$application->pipe(AuthenticationMiddleware::class);
$application->pipe(AuthorizationMiddleware::class);
$application->pipe(InternationalizationMiddleware::class);
$application->pipeDispatchMiddleware();
$application->pipe(NotFoundHandler::class);
45. Ralf EggertRalf Eggert 4545 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Pipeline-Middleware Autorisierung
namespace UserAuthMiddleware;
/* ... */
class AuthorizationMiddleware implements MiddlewareInterface
{
public function process(
Request $request, DelegateInterface $delegate
) {
$result = $request->getAttribute(RouteResult::class, false);
if ($result === false) {
return $delegate->process($request);
}
if (!$this->rbac->isGranted($this->role, $this->permission)) {
throw new RuntimeException('Forbidden', 403);
}
return $delegate->process($request);
}
}
47. Ralf EggertRalf Eggert 4747 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendMvc im Vergleich
Viele
Module
Erprobtes
Konzept
Leichte
Integration
Event
Manager
Gegenwart
Etwas weniger
performant Viel
Erfahrung
Bestands-
Projekte
Migration
einfach
(vom ZF2)
48. Ralf EggertRalf Eggert 4848 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive im Vergleich
Wenige
Module
Neues
Konzept
Schwerere
Integration
Middleware
Pipeline
Zukunft
Sehr
performant Wenig
Erfahrung
Für neue
Projekte
Migration
komplexer
(vom ZF2)