SlideShare una empresa de Scribd logo
1 de 44
PSR-7‫و‬middleware-‫ها‬‫معرفی‬ ‫و‬end Expressive
‫عربی‬ ‫میالد‬
8‫برنامه‬ ‫سال‬
‫نویس‬PHP
‫دهنده‬ ‫توسعه‬BSS/CRM
milad.arabi@gmail.com
@ooghry
Linkedin
microphp.org
I am a PHP developer
• I am not a Zend Framework or Symfony or CakePHP developer
• I think PHP is complicated enough
I like building small things
• I like building small things with simple purposes
• I like to make things that solve problems
• I like building small things that work together to solve larger problems
I want less code, not more
• I want to write less code, not more
• I want to manage less code, not more
• I want to support less code, not more
• I need to justify every piece of code I add to a project
I like simple, readable code
• I want to write code that is easily understood
• I want code that is easily verifiable
‫دنیای‬PHP‫سال‬ ‫در‬
2016
http://www.php-fig.org/members/
PHP Standards Recommendations
PSR-0(DEPRECATED) Autoloading
PSR-1 Basic coding standard
PSR-2 Coding style
PSR-3 Logger
PSR-4 Autoloading
PSR-5(DRAFT) PHPDoc Standard
PSR-6 Caching Interface
PSR-7 HTTP Message Interface
PSR-8(DRAFT) Huggable Interface
PSR-9(DRAFT) Security Advisories
<?php
namespace SymfonyComponentHttpFoundation;
class Request
{
public static function createFromGlobals()
{
$request = self::createRequestFromFactory(
$_GET,
$_POST,
array(),
$_COOKIE,
$_FILES,
$server
);
return $request;
}
}
<?php
namespace ZendHttpPhpEnvironment;
class Request extends HttpRequest
{
public function __construct()
{
$this->setEnv(new Parameters($_ENV));
if ($_GET) {
$this->setQuery(new Parameters($_GET));
}
if ($_POST) {
$this->setPost(new Parameters($_POST));
}
if ($_COOKIE) {
$this->setCookies(new Parameters($_COOKIE));
}
if ($_FILES) {
// convert PHP $_FILES superglobal
$files = $this->mapPhpFiles();
$this->setFiles(new Parameters($files));
}
$this->setServer(new Parameters($_SERVER));
}
}
HTTP Message Interface
• PsrHttpMessageMessageInterface
o PsrHttpMessageResponseInterface
o PsrHttpMessageRequestInterface
 PsrHttpMessageServerRequestInterface
• PsrHttpMessageStreamInterface
• PsrHttpMessageUploadFileInterface
• PsrHttpMessageUriInterface
Message
ResponseRequestStream
Uploaded File Server Request URI
extends
Wrapper
Local filesystem file://
HTTP Address http:// https://
FTP ftp:// ftps://
SSL ssl:// tls://
MySQL tcp://
Zip zip://
MongoDB mongodb://
PHP php://input php://output
php://temp php://memory
<?php
file_get_contents('local_file.json');
file_get_contents('http://site.com/file.json');
Middleware
http://stackphp.com/
https://zend-expressive.readthedocs.io/en/latest/getting-started/features/
function(
RequestInterface $request,
ResponseInterface $response,
callable $next=null
):ReponseInterface
<?php
namespace Mine;
class XClacksOverhead
{
public function __invoke($request, $response, $next)
{
$response = $next($request, $response);
return $response->withHeader(
'X-Clacks-Overhead',
'GNU Terry Pratchett'
);
}
}
Zend Framework
https://github.com/zendframework
zend-diactoros
https://github.com/zendframework/zend-diactoros
PSR-7 HTTP Message implementation
zend-stratigility
https://github.com/zendframework/zend-stratigility
Middleware for PHP built on top of PSR-7
Zend Expressive
•Routing interface
•CountainerInterface
•Templating Interfaceoptional
•Error handlingoptional
composer create-project zendframework/zend-expressive-skeleton
 ZendExpressiveRouterRouterInterface
• public function addRoute(Route $route);
• public function match(Request $request);
• public function generateUri($name, array $substitutions = []);
 InteropContainerContainerInterface
• public function get($id);
• public function has($id);
 ZendExpressiveTemplateTemplateRendererInterface
• public function render($name, $params = []);
• public function addPath($path, $namespace = null);
• public function getPaths();
• public function addDefaultParam($templateName, $param, $value);
 ZendStratigilityFinalHandler
.1‫از‬ ‫استفاده‬ ‫با‬ ‫نصب‬composer
.2‫تعریف‬VirtualHost
.3‫فایل‬ ‫ویرایش‬hosts‫ویندوز‬
Invokable Factory
<?php
class iClass
{
public function method1()
{
return time();
}
}
<?php
class fClass
{
private $adapter;
public function __construct($adapter)
{
$this->adapter=$adapter;
}
public function method1()
{
return $this
->adapter
->someMethod();
}
}
//--------------------------
class fClassFactory
{
public function __invoke()
{
$adapter=new NSAdapterClass;
return new fClass($adapter);
}
}
https://github.com/ooghry/Zend-Expressive-CoderConf
composer require zendframework/zend-db
config/autoload/db.global.php
config/autoload/db.local.php
config/autoload/routes.global.php
[
'name' => 'user.list',
'path' => '/list',
'middleware'=>AppActionListAction::class,
'allowed_methods' => ['GET'],
],
templates/app/list.html.twig
AppActionListAction
AppActionListActionFactory
<?php
namespace AppAction;
use InteropContainerContainerInterface;
use ZendDbAdapterAdapterInterface;
use ZendExpressiveTemplateTemplateRendererInterface;
class ListActionFactory
{
public function __invoke(ContainerInterface $container)
{
$template = ($container->has(TemplateRendererInterface::class))
? $container->get(TemplateRendererInterface::class)
: null;
$adapter = ($container->has(AdapterInterface::class))
? $container->get(AdapterInterface::class)
: null;
return new ListAction($template,$adapter);
}
}
<?php
namespace AppAction;
use ...
class ListAction
{
private $adapter;
private $template;
public function __construct(TemplateRendererInterface $template, $adapter)
{
$this->adapter = $adapter;
$this->template = $template;
}
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next = null
){
$statement = $this->adapter->query('select * from profile');
$users = $statement->execute();
return new HtmlResponse(
$this->template->render('app::list', ['users' => $users])
);
}
}
<?php
namespace AppAction;
use ZendDiactorosResponseJsonResponse;
use PsrHttpMessageResponseInterface;
use PsrHttpMessageServerRequestInterface;
class PingAction
{
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next = null)
{
return new JsonResponse(['ack' => time()]);
}
}
config/autoload/middleware-pipeline.global.php
'always' => [
'middleware' => [
HelperServerUrlMiddleware::class,
AppMiddlewareAuthMiddleware::class,
],
'priority' => PHP_INT_MAX,
],
config/autoload/dependencies.global.php
'factories' => [
AppMiddlewareAuthMiddleware::class => AppMiddlewareAuthMiddlewareFactory::class,
],
App
Auth
src/App/Middleware/AuthMiddleware.php
<?php
namespace AppMiddleware;
use ...
class AuthMiddleware
{
private $helper;
public function __construct(UrlHelper $helper)
{
$this->helper=$helper;
}
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null)
{
if($this->helper->generate('api.ping')!=$request->getUri()->getPath()) {
$auth = $this->parseAuth($request->getHeaderLine('Authorization'));
if (!$auth or !$this->checkUserPass($auth['user'], $auth['pass'])) {
return $response
->withHeader('WWW-Authenticate', 'Basic realm=""')
->withStatus(401);
}
}
$response = $next($request, $response);
return $response;
}
}
Download Middleware
config/autoload/routes.global.php
[
'name' => 'download',
'path' => '/download/{file:[_0-9a-zA-Z-]+.w{1,}}',
'middleware' => AppActionDownloadAction::class,
'allowed_methods' => ['GET'],
],
AppActionDownloadAction
class DownloadAction
{
public function __invoke($request, $response, $next = null)
{
$file='data'.$request->getUri()->getPath();
if(is_readable($file)){
return $response
->write(file_get_contents($file))
->withHeader(
'Content-Disposition',
'inline; filename="' . pathinfo($file,PATHINFO_BASENAME) . '"'
)
->withHeader('Content-type',pathinfo($file,PATHINFO_EXTENSION))
->withStatus(200);
}else{
return $next($request, $response);
}
}
}
App
Auth
Unavailable
config/autoload/middleware-pipeline.global.php
'middleware' => [
HelperServerUrlMiddleware::class,
AppMiddlewareUnavailableMiddleware::class,
AppMiddlewareAuthMiddleware::class,
],
AppMiddlewareUnavailableMiddleware
public function __invoke($request, $response, callable $next = null)
{
if (date('G') == '23' || (date('G') == '0' && date('i') < '30')) {
return new HtmlResponse($this->template->render('app::unavailable'));
}
$response = $next($request, $response);
return $response;
}
AppMiddlewareUnavailableMiddlewareFactory
templates/app/unavailable.html.twig
config/autoload/dependencies.global.php
‫متشکرم‬
PSR-7‫و‬middleware-‫معرفی‬ ‫و‬ ‫ها‬Zend Expressive
‫عربی‬ ‫میالد‬
milad.arabi@gmail.com
@ooghry
Linkedin
https://github.com/ooghry/Zend-Expressive-CoderConf

Más contenido relacionado

La actualidad más candente

PHP7 - The New Engine for old good train
PHP7 - The New Engine for old good trainPHP7 - The New Engine for old good train
PHP7 - The New Engine for old good train
Xinchen Hui
 
Getting started with Catalyst and extjs
Getting started with Catalyst and extjsGetting started with Catalyst and extjs
Getting started with Catalyst and extjs
Peter Edwards
 
How to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rbHow to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rb
Hiroshi SHIBATA
 
Behat Workshop at WeLovePHP
Behat Workshop at WeLovePHPBehat Workshop at WeLovePHP
Behat Workshop at WeLovePHP
Marcos Quesada
 
Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)
Kousuke Ebihara
 

La actualidad más candente (20)

PHP Development Tools
PHP  Development ToolsPHP  Development Tools
PHP Development Tools
 
PHP7 - The New Engine for old good train
PHP7 - The New Engine for old good trainPHP7 - The New Engine for old good train
PHP7 - The New Engine for old good train
 
30 Minutes To CPAN
30 Minutes To CPAN30 Minutes To CPAN
30 Minutes To CPAN
 
Getting started with Perl XS and Inline::C
Getting started with Perl XS and Inline::CGetting started with Perl XS and Inline::C
Getting started with Perl XS and Inline::C
 
A brief to PHP 7.3
A brief to PHP 7.3A brief to PHP 7.3
A brief to PHP 7.3
 
Php internal architecture
Php internal architecturePhp internal architecture
Php internal architecture
 
Modern Web Development with Perl
Modern Web Development with PerlModern Web Development with Perl
Modern Web Development with Perl
 
Ninja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersNinja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for Beginners
 
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides:  Let's build macOS CLI Utilities using SwiftMobileConf 2021 Slides:  Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
 
[Community Open Camp] 給 PHP 開發者的 VS Code 指南
[Community Open Camp] 給 PHP 開發者的 VS Code 指南[Community Open Camp] 給 PHP 開發者的 VS Code 指南
[Community Open Camp] 給 PHP 開發者的 VS Code 指南
 
Apigility – Lightning Fast API Development - OSSCamp 2014
Apigility – Lightning Fast API Development - OSSCamp 2014 Apigility – Lightning Fast API Development - OSSCamp 2014
Apigility – Lightning Fast API Development - OSSCamp 2014
 
Modern Black Mages Fighting in the Real World
Modern Black Mages Fighting in the Real WorldModern Black Mages Fighting in the Real World
Modern Black Mages Fighting in the Real World
 
Functional Programming for Busy Object Oriented Programmers
Functional Programming for Busy Object Oriented ProgrammersFunctional Programming for Busy Object Oriented Programmers
Functional Programming for Busy Object Oriented Programmers
 
PHP from soup to nuts Course Deck
PHP from soup to nuts Course DeckPHP from soup to nuts Course Deck
PHP from soup to nuts Course Deck
 
Getting started with Catalyst and extjs
Getting started with Catalyst and extjsGetting started with Catalyst and extjs
Getting started with Catalyst and extjs
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalyst
 
How to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rbHow to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rb
 
Behat Workshop at WeLovePHP
Behat Workshop at WeLovePHPBehat Workshop at WeLovePHP
Behat Workshop at WeLovePHP
 
Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)
 
Building an API with Django and Django REST Framework
Building an API with Django and Django REST FrameworkBuilding an API with Django and Django REST Framework
Building an API with Django and Django REST Framework
 

Destacado

Creatividad e-innovación-en-tiempos-de-crisis-final
Creatividad e-innovación-en-tiempos-de-crisis-finalCreatividad e-innovación-en-tiempos-de-crisis-final
Creatividad e-innovación-en-tiempos-de-crisis-final
Farid Mokhtar Noriega
 
20110524 google earthの最前線
20110524 google earthの最前線20110524 google earthの最前線
20110524 google earthの最前線
Taichi Furuhashi
 
How2 openstreetmap gettingstarted
How2 openstreetmap gettingstartedHow2 openstreetmap gettingstarted
How2 openstreetmap gettingstarted
Taichi Furuhashi
 
20131019 青年土地家屋調査士 全国大会講演資料 2013
20131019 青年土地家屋調査士 全国大会講演資料 201320131019 青年土地家屋調査士 全国大会講演資料 2013
20131019 青年土地家屋調査士 全国大会講演資料 2013
Taichi Furuhashi
 
12 17 08 Creating A Blog
12 17 08 Creating A Blog12 17 08 Creating A Blog
12 17 08 Creating A Blog
Judy Kammerer
 

Destacado (20)

20151030 富士通SS研 講演予定資料 @ 神戸
20151030 富士通SS研 講演予定資料 @ 神戸20151030 富士通SS研 講演予定資料 @ 神戸
20151030 富士通SS研 講演予定資料 @ 神戸
 
MEETLOAF
MEETLOAFMEETLOAF
MEETLOAF
 
Creatividad e-innovación-en-tiempos-de-crisis-final
Creatividad e-innovación-en-tiempos-de-crisis-finalCreatividad e-innovación-en-tiempos-de-crisis-final
Creatividad e-innovación-en-tiempos-de-crisis-final
 
GSU MBA Leadership Speaker Series
GSU MBA Leadership Speaker SeriesGSU MBA Leadership Speaker Series
GSU MBA Leadership Speaker Series
 
Atlanta Women Entrepreneurs
Atlanta Women EntrepreneursAtlanta Women Entrepreneurs
Atlanta Women Entrepreneurs
 
すごい災害対応訓練2014浦安 事前説明
すごい災害対応訓練2014浦安 事前説明すごい災害対応訓練2014浦安 事前説明
すごい災害対応訓練2014浦安 事前説明
 
20110524 google earthの最前線
20110524 google earthの最前線20110524 google earthの最前線
20110524 google earthの最前線
 
The 10 Unbreakable Laws Of Social Media
The 10 Unbreakable Laws Of Social MediaThe 10 Unbreakable Laws Of Social Media
The 10 Unbreakable Laws Of Social Media
 
How2 openstreetmap gettingstarted
How2 openstreetmap gettingstartedHow2 openstreetmap gettingstarted
How2 openstreetmap gettingstarted
 
六合彩,香港六合彩 » SlideShare
六合彩,香港六合彩 » SlideShare六合彩,香港六合彩 » SlideShare
六合彩,香港六合彩 » SlideShare
 
Futebol
FutebolFutebol
Futebol
 
Popis usluga iz sustava javne nabave
Popis usluga iz sustava javne nabavePopis usluga iz sustava javne nabave
Popis usluga iz sustava javne nabave
 
Berninipp
BerninippBerninipp
Berninipp
 
Leadership for Women Business Owners
Leadership for Women Business OwnersLeadership for Women Business Owners
Leadership for Women Business Owners
 
20131019 青年土地家屋調査士 全国大会講演資料 2013
20131019 青年土地家屋調査士 全国大会講演資料 201320131019 青年土地家屋調査士 全国大会講演資料 2013
20131019 青年土地家屋調査士 全国大会講演資料 2013
 
NENV Design Studio 2014 F - 湖畔で学ベンチ
NENV Design Studio 2014 F - 湖畔で学ベンチNENV Design Studio 2014 F - 湖畔で学ベンチ
NENV Design Studio 2014 F - 湖畔で学ベンチ
 
FOSS4G Tokyo 2011: THE UNIFORM PROJECT
FOSS4G Tokyo 2011: THE UNIFORM PROJECTFOSS4G Tokyo 2011: THE UNIFORM PROJECT
FOSS4G Tokyo 2011: THE UNIFORM PROJECT
 
12 17 08 Creating A Blog
12 17 08 Creating A Blog12 17 08 Creating A Blog
12 17 08 Creating A Blog
 
Molome infrastructure
Molome infrastructureMolome infrastructure
Molome infrastructure
 
Library Media And Technology Services
Library Media And Technology ServicesLibrary Media And Technology Services
Library Media And Technology Services
 

Similar a PSR-7 - Middleware - Zend Expressive

HackU PHP and Node.js
HackU PHP and Node.jsHackU PHP and Node.js
HackU PHP and Node.js
souridatta
 

Similar a PSR-7 - Middleware - Zend Expressive (20)

Website designing company_in_delhi_phpwebdevelopment
Website designing company_in_delhi_phpwebdevelopmentWebsite designing company_in_delhi_phpwebdevelopment
Website designing company_in_delhi_phpwebdevelopment
 
Starting Out With PHP
Starting Out With PHPStarting Out With PHP
Starting Out With PHP
 
Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8
 
Wt unit 4 server side technology-2
Wt unit 4 server side technology-2Wt unit 4 server side technology-2
Wt unit 4 server side technology-2
 
Introduction to PHP - SDPHP
Introduction to PHP - SDPHPIntroduction to PHP - SDPHP
Introduction to PHP - SDPHP
 
Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018
 
Improving qa on php projects
Improving qa on php projectsImproving qa on php projects
Improving qa on php projects
 
Basics PHP
Basics PHPBasics PHP
Basics PHP
 
Quality assurance for php projects with PHPStorm
Quality assurance for php projects with PHPStormQuality assurance for php projects with PHPStorm
Quality assurance for php projects with PHPStorm
 
Getting up & running with zend framework
Getting up & running with zend frameworkGetting up & running with zend framework
Getting up & running with zend framework
 
Getting up and running with Zend Framework
Getting up and running with Zend FrameworkGetting up and running with Zend Framework
Getting up and running with Zend Framework
 
Using the new WordPress REST API
Using the new WordPress REST APIUsing the new WordPress REST API
Using the new WordPress REST API
 
Becoming a better WordPress Developer
Becoming a better WordPress DeveloperBecoming a better WordPress Developer
Becoming a better WordPress Developer
 
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
 
LAB PHP Consolidated.ppt
LAB PHP Consolidated.pptLAB PHP Consolidated.ppt
LAB PHP Consolidated.ppt
 
Php
PhpPhp
Php
 
Phphacku iitd
Phphacku iitdPhphacku iitd
Phphacku iitd
 
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
 
HackU PHP and Node.js
HackU PHP and Node.jsHackU PHP and Node.js
HackU PHP and Node.js
 
PHP BASIC PRESENTATION
PHP BASIC PRESENTATIONPHP BASIC PRESENTATION
PHP BASIC PRESENTATION
 

Último

%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 

Último (20)

Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 

PSR-7 - Middleware - Zend Expressive