SlideShare ist ein Scribd-Unternehmen logo
1 von 80
Downloaden Sie, um offline zu lesen
PHPDay 2016 - Verona, Italy, May 13th 2016 - @marcoshuttle @maraspin
Beyond PSR-7
The magical middleware tour
MARCO
EXPLORER
AVID LEARNER
CHOCOLATE LOVER
STEVE
ENJOYS TRAVELLING
SOFTWARE ARCHITECTURES
IN A FEW YEARS...
Software Engineers
START OF THE JOURNEY...
EVERYBODY ON ITS OWN
A Total Mess
$filename = 'log.txt'; 
$handle = fopen($filename, 'a')); 
fwrite($handle, $errorMessage); 
fclose($handle);
$filename = 'log.txt'; 
$handle = fopen($filename, 'a')); 
fwrite($handle, $errorMessage); 
fclose($handle);
LIBRARIES
Include Hell
include 'config.php'; 
include_once 'dbcon.php'; 
include_once 'logger.php'; 
include 'utils.php'; 
include 'forms.php'; 
include 'calculations.php'; 
include 'graphs.php'; 
include 'auth.php';
MVC Frameworks
IOC FIRST WAVE
Same things, different ways...
Zend Framework
Symfony
$logger = new Zend_Log(); 
$writer = new Zend_Log_Writer_Stream('php://output'); 
$logger­>addWriter($writer); 
$logger­>log('Hello PHPDay People!', Zend_Log::INFO);
// YAML Configuration 
// [...] 
sfContext::getInstance()­>getLogger()­>info('Hello PHPDay People!');
REINVENTING THE WHEEL
WITH A LITTLE HELP OF...
Microframeworks
IOC NEW WAVE
ONE ISSUE TO SOLVE...
namespace SymfonyComponentHttpFoundation; 
class Request { 
    public static function createFromGlobals(): Request { 
        return self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_
    }
}
namespace ZendHttpPhpEnvironment; 
class Request extends ZendHttpRequest { 
    public function __construct() { 
        $this­>setEnv(new Parameters($_ENV)); 
        $this­>setQuery(new Parameters($_GET)); 
        $this­>setPost(new Parameters($_POST)); 
        $this­>setCookies(new Parameters($_COOKIE)); 
        $this­>setFiles(new Parameters($this­>mapPhpFiles())); 
        $this­>setServer(new Parameters($_SERVER)); 
    }
}
NEED FOR
A GOOD HTTP ABSTRACTION
SERVER API
$_SERVER
$_POST
$_GET
header()
setCookie()
echo
CLIENT ADAPTERS
PSR-7
PSR-7 GOALS
INTERFACES
PRACTICAL APPLICATIONS AND USABILITY
NO LIMITS
SERVER AND CLIENT
PSR-7 NON-GOALS
CONFORMATION
IMPOSE DETAILS
A VALUE OBJECT IS FOREVER
Pipes and filters
Pizza Example
DECORATOR
interface Pizza
class Margherita implements Pizza 
class CheeseDecoratedPizza implements Pizza 
{ 
    function __construct(Pizza $pizza) 
} 
class VegetablesDecoratedPizza implements Pizza 
{ 
    function __construct(Pizza $pizza) 
}
$myFavouritePizza = 
    new VegatablesDecoratedPizza( 
        new CheeseDecoratedPizza( 
            new Margherita() 
        ) 
    );
MIDDLEWARE
MIDDLEWARE
function (Request request): Response 
{ 
    ... 
    response = next(request); 
    ... 
    return response; 
}
MIDDLEWARE
function (Request): Response
MIDDLEWARE
function (Request, Response): Response
MIDDLEWARE
function (
    Request request, 
    Response response, 
    callable next 
): Response
HOT WEEK
MIDDLEWARE IN ACTION
class Middleware 
{ 
    function __invoke($request, $response, $next) 
    {
        if (!$this­>preconditionsExist($request, $response)) { 
            throw new RuntimeException(); 
        } 
        $request = $this­>doSomethingOnRequest($request); 
        $response = $next($request, $response); 
        return $this­>doSomethingOnResponse($response); 
    }
}
class BasicAuthentication 
{ 
    function __invoke($request, $response, $next) 
    {
        $authorization = $request­>getHeaderLine('Authorization'); 
        if ($this­>checkUserPassword($authorization)) { 
            $request = self::setAttribute( 
                $request, 
                'USERNAME', 
                $authorization['username'] 
            ); 
            return $next($request, $response); 
        } 
        return $this­>unauthorizedUserResponse($response); 
    }
}
class AccessLog
{ 
    function __invoke($request, $response, $next) 
    {
        if (!self::hasAttribute($request, 'CLIENT_IPS')) { 
            throw new RuntimeException(); 
        } 
        $response = $next($request, $response); 
        $message = $this­>createMessage($request, $response); 
        $this­>logger­>log($message); 
        return $response; 
    }
}
Slim
Slim
// src/middleware.php 
$app­>add(new AccessLog($logger)); 
$app­>add(new Geolocate()); 
$app­>add(new ClientIp()); 
$app­>add(new BasicAuthentication($users));
Radar & Relay
Radar & Relay
// web/index.php 
$adr­>middle(new BasicAuthentication($users)); 
$adr­>middle(new ClientIp()); 
$adr­>middle(new Geolocate()); 
$adr­>middle(new AccessLog($logger));
Expressive
Expressive
// config/autoload/middleware­pipeline.global.php 
return [
    'middleware­pipeline' => [ 
        'basic_authentication' => [ 
            'middleware' => new BasicAuthentication($users), 
            'priority' => 4000 
        ], 
        'clientip' => [ 
            'middleware' => ClientIp::class, 
            'priority' => 3000 
        ], 
        'geolocate' => [ 
            'middleware' => Geolocate::class, 
            'priority' => 2000 
        ], 
        'access­log' => [ 
            'middleware' => new AccessLog($logger), 
            'priority' => 1000 
        ] 
    ]
];
The magical Expressive tour
// config/autoload/middleware­pipeline.global.php 
return [
    'middleware­pipeline' => [ 
        'always' => [ 
            'middleware' => [ 
                HelperServerUrlMiddleware::class 
            ], 'priority' => 10000 
        ], 
        'routing' => [ 
            'middleware' => [ 
                ApplicationFactory::ROUTING_MIDDLEWARE, 
                HelperUrlHelperMiddleware::class, 
                ApplicationFactory::DISPATCH_MIDDLEWARE 
            ], 'priority' => 1 
        ], 
        'error' => [ 
            'middleware' => [], 'error' => true, 'priority' => ­10000 
        ] 
    ]
];
ReactPhp
Expressive/ReactPhp
// config/autoload/middleware­pipeline.global.php 
return [
    'dependencies' => [ 
        'factories' => [ 
            React2Psr7StaticFiles::class => React2Psr7StaticFilesFactory::class, 
        ] 
    ],
    'middleware_pipeline' => [ 
        'static' => [ 
            'middleware' => React2Psr7StaticFiles::class, 
            'priority' => 100000, // Execute earliest! 
        ], 
        ... 
    ]
];
USE CASES
Debug bar
class DebugBar 
{
    public function __invoke($request, $response, $next) 
    {
        if (!self::hasAttribute($request, FormatNegotiator::KEY)) { 
            throw new RuntimeException('Need FormatNegotiator executed before'); 
        } 
        if ($this­>isAsset($request)) { 
            return $this­>responsewithAssetBody($request, $response); 
        } 
        $response = $next($request, $response); 
        if (UtilsHelpers::isRedirect($response)) { 
            $this­>debugBar­>stackData(); 
        } else if (FormatNegotiator::getFormat($request) === 'html') { 
            $response = $this­>createHtmlResponse($response); 
        } else if (UtilsHelpers::isAjax($request)) { 
            $response = $this­>createAjaxResponse($response); 
        } 
        return $response; 
    }
}
More Available Middleware
Storage-Less Sessions
Device Detection
Analytics Support
Robot-Blocking
Request Rate Limiting
And More...
Roundup
PSR-7: A good HTTP abstraction
Abstractions VS Implementations
Re-Inventing the Wheel is over
Middleware is a Hot Topic
Beware of Runtime Dangers
THANK YOU VERY MUCH
Resources
by
by
documentation
by
documentation
by
documentation
PSR-7 By Example Matthew Weier O'Phinney
On HTTP, Middleware, and PSR-7 Matthew Weier O'Phinney
Slim framework
Slim resources
Radar
Radar and middleware resources Paul M. Jones
Zend Expressive
Proposed Middleware Interface PSR-N
Speakers love feedback
Leave your feedback at https://joind.in/talk/1ccba
Marco
Steve
@marcoshuttle m.perone@mvlabs.it
@maraspin s.maraspin@mvassociati.it
ALL YOU NEED IS MIDDLEWARE
Credits
Plane view by
Chocolate by
Orioles Fan by
Mosque by
Fans by
Hippies by
Hippie Van by
Students by
Rave by
Weird Bicicle by
Suitcase found at
A320 model found at
Beatles picture by
Beatles picture by
Board by
Abstract painting by
Figs by
Kungsleden by
Danger zone by
PSR-7 diagram by
Diamond by
Pizza by
Cheese and vegetables by
Pizza by
Onion by
Onion by
Cutting onion by
Onion by
Onion by
Onion by
Locked door by
Log by
Victor Costan
John Loo
Keith Allison
Fasihjee
Mirage Kale
Roland Godefroy
Joe Mabel
Shimer College
EDM Playlist
Thomas Guest
publicdomainpictures.net
wesharepics.info
Nationaal Archief
United Press Intl.
ericfleming8
Earle M. Pilgrim
Mburnat
Shyguy24x7
cvander
ninjagrl
EWAR
ElfQrin
StockSnap
Scott bauer
Colin
Amada44
Lali Masriera
darwinbell
costanzimarco
sarangib
LEEROY.ca
Greenpeace Finland

Weitere ähnliche Inhalte

Andere mochten auch

AWS-NFS-Newsletter-2016-Volume3
AWS-NFS-Newsletter-2016-Volume3AWS-NFS-Newsletter-2016-Volume3
AWS-NFS-Newsletter-2016-Volume3
Kelly Law
 
Atividades fim de semana 23 e 24 junho
Atividades fim de semana  23 e 24 junhoAtividades fim de semana  23 e 24 junho
Atividades fim de semana 23 e 24 junho
Sofia Cabral
 
ReferenceLetterSparebank1
ReferenceLetterSparebank1ReferenceLetterSparebank1
ReferenceLetterSparebank1
henripenri
 

Andere mochten auch (18)

Sole 24 ore
Sole 24 oreSole 24 ore
Sole 24 ore
 
Só a presença de jesus
Só a presença de jesusSó a presença de jesus
Só a presença de jesus
 
certificate
certificatecertificate
certificate
 
Using ICT in primary school.
Using ICT in primary school. Using ICT in primary school.
Using ICT in primary school.
 
2.bone.letterform
2.bone.letterform2.bone.letterform
2.bone.letterform
 
Certificat ALtran
Certificat ALtranCertificat ALtran
Certificat ALtran
 
.
..
.
 
AWS-NFS-Newsletter-2016-Volume3
AWS-NFS-Newsletter-2016-Volume3AWS-NFS-Newsletter-2016-Volume3
AWS-NFS-Newsletter-2016-Volume3
 
It has to be glaice
 It has to be glaice It has to be glaice
It has to be glaice
 
Atividades fim de semana 23 e 24 junho
Atividades fim de semana  23 e 24 junhoAtividades fim de semana  23 e 24 junho
Atividades fim de semana 23 e 24 junho
 
Ensayo final
Ensayo finalEnsayo final
Ensayo final
 
Pilares do Zend Framework 2
Pilares do Zend Framework 2Pilares do Zend Framework 2
Pilares do Zend Framework 2
 
Microsoft
MicrosoftMicrosoft
Microsoft
 
Orquestrando Aplicações PHP com Symfony
Orquestrando Aplicações PHP com SymfonyOrquestrando Aplicações PHP com Symfony
Orquestrando Aplicações PHP com Symfony
 
50 english essay practice
50 english essay practice50 english essay practice
50 english essay practice
 
ReferenceLetterSparebank1
ReferenceLetterSparebank1ReferenceLetterSparebank1
ReferenceLetterSparebank1
 
TDC 2015 - Wearables no IoT (PT-BR)
TDC 2015 - Wearables no IoT (PT-BR)TDC 2015 - Wearables no IoT (PT-BR)
TDC 2015 - Wearables no IoT (PT-BR)
 
TDC São Paulo 2016 - Become a jedi with php streams
TDC São Paulo 2016 - Become a jedi with php streamsTDC São Paulo 2016 - Become a jedi with php streams
TDC São Paulo 2016 - Become a jedi with php streams
 

Ähnlich wie Beyond PSR-7: The magical middleware tour

Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )
Joseph Scott
 
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
elevenma
 
Barcelona 2010 hidden_features
Barcelona 2010 hidden_featuresBarcelona 2010 hidden_features
Barcelona 2010 hidden_features
Anis Berejeb
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Tatsuhiko Miyagawa
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends
旻琦 潘
 

Ähnlich wie Beyond PSR-7: The magical middleware tour (20)

RESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroRESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher Pecoraro
 
Zend Expressive in 15 Minutes
Zend Expressive in 15 MinutesZend Expressive in 15 Minutes
Zend Expressive in 15 Minutes
 
DEF CON 27 - PATRICK WARDLE - harnessing weapons of Mac destruction
DEF CON 27 - PATRICK WARDLE - harnessing weapons of Mac destructionDEF CON 27 - PATRICK WARDLE - harnessing weapons of Mac destruction
DEF CON 27 - PATRICK WARDLE - harnessing weapons of Mac destruction
 
Lca05
Lca05Lca05
Lca05
 
Api Design
Api DesignApi Design
Api Design
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
Giới thiệu PHP 7
Giới thiệu PHP 7Giới thiệu PHP 7
Giới thiệu PHP 7
 
Perl Moderno
Perl ModernoPerl Moderno
Perl Moderno
 
Let's write secure Drupal code! - DrupalCamp Spain 2019
Let's write secure Drupal code! - DrupalCamp Spain 2019Let's write secure Drupal code! - DrupalCamp Spain 2019
Let's write secure Drupal code! - DrupalCamp Spain 2019
 
Listen afup 2010
Listen afup 2010Listen afup 2010
Listen afup 2010
 
Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )
 
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
 
Fluentd v1 and Roadmap
Fluentd v1 and RoadmapFluentd v1 and Roadmap
Fluentd v1 and Roadmap
 
Barcelona 2010 hidden_features
Barcelona 2010 hidden_featuresBarcelona 2010 hidden_features
Barcelona 2010 hidden_features
 
Php 7 evolution
Php 7 evolutionPhp 7 evolution
Php 7 evolution
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends
 
Creating Clean Code with AOP (WebExpo 2010)
Creating Clean Code with AOP (WebExpo 2010)Creating Clean Code with AOP (WebExpo 2010)
Creating Clean Code with AOP (WebExpo 2010)
 
非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumaki非同期処理の通知処理 with Tatsumaki
非同期処理の通知処理 with Tatsumaki
 
The WordPress way, the modern way: developing as if it were 2016
The WordPress way, the modern way: developing as if it were 2016The WordPress way, the modern way: developing as if it were 2016
The WordPress way, the modern way: developing as if it were 2016
 

Kürzlich hochgeladen

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
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
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 

Kürzlich hochgeladen (20)

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
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
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
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
%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
 
%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
 
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...
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
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...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
%+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...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 

Beyond PSR-7: The magical middleware tour