SlideShare une entreprise Scribd logo
1  sur  50
Télécharger pour lire hors ligne
Middleware-AnwendungenMiddleware-Anwendungen
mit dem Zend Framework 3mit dem Zend Framework 3
Ralf EggertRalf Eggert
CEO Travello GmbH, PHP Entwickler,CEO Travello GmbH, PHP Entwickler,
Zend Framework Trainer, Autor & Coach sowieZend Framework Trainer, Autor & Coach sowie
Amazon Alexa Skill EntwicklerAmazon Alexa Skill Entwickler
Teil 1Teil 1
Einführung inEinführung in ZendExpressiveZendExpressive
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
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
Ralf EggertRalf Eggert 66 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Was ist die PHP-FIG?
Ralf EggertRalf Eggert 77 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Was ist der PSR-7?
Ralf EggertRalf Eggert 88 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Was ist der PSR-15?
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
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
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
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
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
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
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
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
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
Teil 2Teil 2
Installation & Aufbau der AnwendungInstallation & Aufbau der Anwendung
Ralf EggertRalf Eggert 1919 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive installieren I
Ralf EggertRalf Eggert 2020 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive installieren II
Ralf EggertRalf Eggert 2121 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
ZendExpressive installieren III
Ralf EggertRalf Eggert 2222 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Skeleton Application
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
Ralf EggertRalf Eggert 2424 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Aufbau des App Moduls
 module
 App
 src
 Action
 HomePageAction.php
 HomePageFactory.php
 PingAction.php
 ConfigProvider.php
 templates
 app
 home-page.phtml
 error
 404.phtml
 error.phtml
 layout
 default.phtml
Teil 3Teil 3
Modularität & ArchitekturModularität & Architektur
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
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
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
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
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
Ralf EggertRalf Eggert 3131 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Verzeichnisse im Schichtenmodell
 module
 CustomerApp
 src
 Application
 Action
 HomePageAction.php
 HomePageFactory.php
 Presentation
 Form
 CustomerForm.php
 View
 Helper
 CustomerCountry.php
 ConfigProvider.php
 module
 CustomerDomain
 src
 Domain
 Repository
 CustomerRepository.php
 Infrastructure
 Db
 CustomerTable.php
 ConfigProvider.php
Teil 4Teil 4
Action-MiddlewareAction-Middleware
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
Ralf EggertRalf Eggert 3434 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
Beispiele für Action-Middleware
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
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)
);
}
}
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]+']]
);
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);
}
}
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'
);
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);
}
}
Ralf EggertRalf Eggert 4141 vonvon 5050
Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3
RESTful Routing
/** @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]+']]);
$application->post(
'/customer',
CustomerCreateAction::class,
'customer-create'
);
Teil 5Teil 5
Middleware-PipelineMiddleware-Pipeline
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
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);
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);
}
}
Teil 6Teil 6
Vergleiche MVC zu MiddlewareVergleiche MVC zu Middleware
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)
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)
Fragen?Fragen?
Danke!Danke!
Fragen an ralf@travello.deFragen an ralf@travello.de

Contenu connexe

Tendances

Tendances (10)

Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...
Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...
Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...
 
Dev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei TechnosoftDev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei Technosoft
 
Dream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio ExtensionsDream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio Extensions
 
.NET zu .NET Core
.NET zu .NET Core.NET zu .NET Core
.NET zu .NET Core
 
Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...
Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...
Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...
 
PHP auf IBM Plattformen
PHP auf IBM PlattformenPHP auf IBM Plattformen
PHP auf IBM Plattformen
 
Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?
 
BASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio ExtensionsBASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio Extensions
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes sein
 
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
 

Similaire à Middleware Anwendungen mit dem Zend Framework 3

Similaire à Middleware Anwendungen mit dem Zend Framework 3 (20)

IPC2017SE - Zend\Expressive Workshop
IPC2017SE - Zend\Expressive WorkshopIPC2017SE - Zend\Expressive Workshop
IPC2017SE - Zend\Expressive Workshop
 
IPC 2017 - Legacy-Anwendungen mit Expressive modernisieren
IPC 2017 - Legacy-Anwendungen mit Expressive modernisierenIPC 2017 - Legacy-Anwendungen mit Expressive modernisieren
IPC 2017 - Legacy-Anwendungen mit Expressive modernisieren
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
PHPblue LOS!NRW
PHPblue LOS!NRWPHPblue LOS!NRW
PHPblue LOS!NRW
 
APIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellenAPIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellen
 
IPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedIPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 Reloaded
 
Servervirtualisierung Mit Hyper V
Servervirtualisierung Mit Hyper VServervirtualisierung Mit Hyper V
Servervirtualisierung Mit Hyper V
 
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
 
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge UnternehmenGewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
 
Zend Framework 2.0
Zend Framework 2.0Zend Framework 2.0
Zend Framework 2.0
 
Zend Framework 2 - Best Practices
Zend Framework 2 - Best PracticesZend Framework 2 - Best Practices
Zend Framework 2 - Best Practices
 
Architekturen für .NET Core-Anwendungen
Architekturen für .NET Core-AnwendungenArchitekturen für .NET Core-Anwendungen
Architekturen für .NET Core-Anwendungen
 
BizSpark goes Cloud
BizSpark goes CloudBizSpark goes Cloud
BizSpark goes Cloud
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
 
SignalR
SignalRSignalR
SignalR
 
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-AnwendungenBASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
 
Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?
 
Mit LoRaWAN und Serverless zur eigenen Smart-Office-Lösung
Mit LoRaWAN und Serverless zur eigenen Smart-Office-LösungMit LoRaWAN und Serverless zur eigenen Smart-Office-Lösung
Mit LoRaWAN und Serverless zur eigenen Smart-Office-Lösung
 
Net@night asp.net mvc
Net@night asp.net mvcNet@night asp.net mvc
Net@night asp.net mvc
 
Webbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriverWebbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriver
 

Plus de Ralf Eggert

Plus de Ralf Eggert (20)

ChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heuteChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heute
 
Der ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 EditionDer ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 Edition
 
PHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickelnPHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickeln
 
Alexa, what's next?
Alexa, what's next?Alexa, what's next?
Alexa, what's next?
 
Alexa, wohin geht die Reise
Alexa, wohin geht die ReiseAlexa, wohin geht die Reise
Alexa, wohin geht die Reise
 
8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface Meetup8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface Meetup
 
Welcome Bixby
Welcome BixbyWelcome Bixby
Welcome Bixby
 
Alexa Skill Maintenance
Alexa Skill MaintenanceAlexa Skill Maintenance
Alexa Skill Maintenance
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu Laminas
 
Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?
 
Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu Laminas
 
Alexa for Hospitality
Alexa for HospitalityAlexa for Hospitality
Alexa for Hospitality
 
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
 
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche SprachanwendungenFortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
 
Die sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice ProjekteDie sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice Projekte
 
Künstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und WirklichkeitKünstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und Wirklichkeit
 
Multi-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon AlexaMulti-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon Alexa
 
Mein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein BackendMein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein Backend
 
Zend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next GenerationZend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next Generation
 

Middleware Anwendungen mit dem Zend Framework 3

  • 1. Middleware-AnwendungenMiddleware-Anwendungen mit dem Zend Framework 3mit dem Zend Framework 3
  • 2. Ralf EggertRalf Eggert CEO Travello GmbH, PHP Entwickler,CEO Travello GmbH, PHP Entwickler, Zend Framework Trainer, Autor & Coach sowieZend Framework Trainer, Autor & Coach sowie Amazon Alexa Skill EntwicklerAmazon Alexa Skill Entwickler
  • 3. Teil 1Teil 1 Einführung inEinführung in ZendExpressiveZendExpressive
  • 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
  • 18. Teil 2Teil 2 Installation & Aufbau der AnwendungInstallation & Aufbau der Anwendung
  • 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
  • 24. Ralf EggertRalf Eggert 2424 vonvon 5050 Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3 Aufbau des App Moduls  module  App  src  Action  HomePageAction.php  HomePageFactory.php  PingAction.php  ConfigProvider.php  templates  app  home-page.phtml  error  404.phtml  error.phtml  layout  default.phtml
  • 25. Teil 3Teil 3 Modularität & ArchitekturModularität & Architektur
  • 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
  • 31. Ralf EggertRalf Eggert 3131 vonvon 5050 Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3 Verzeichnisse im Schichtenmodell  module  CustomerApp  src  Application  Action  HomePageAction.php  HomePageFactory.php  Presentation  Form  CustomerForm.php  View  Helper  CustomerCountry.php  ConfigProvider.php  module  CustomerDomain  src  Domain  Repository  CustomerRepository.php  Infrastructure  Db  CustomerTable.php  ConfigProvider.php
  • 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); } }
  • 41. Ralf EggertRalf Eggert 4141 vonvon 5050 Middleware Anwendungen mit dem Zend Framework 3Middleware Anwendungen mit dem Zend Framework 3 RESTful Routing /** @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]+']]); $application->post( '/customer', CustomerCreateAction::class, 'customer-create' );
  • 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); } }
  • 46. Teil 6Teil 6 Vergleiche MVC zu MiddlewareVergleiche MVC zu Middleware
  • 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)