MIDDLEWARE	WEB	APIS	IN	PHP	7.X Jan	Burkl Solution	Consulting	Manager ,	Dresden,	22nd	September	2017 Rogue	Wave	Software php	developer	day	2017
PHP PHP:	Hypertext	Preprocessor The	most	popular	server-side	language:	PHP	is used	by	82.6%	of	all	the	websites	(source: ) Used	by	Facebook,	Wikipedia,	Yahoo,	Etsy, Flickr,	Digg,	etc 22	years	of	usage,	since	1995 Full	OOP	support	since	PHP	5 w3techs.com
PHP	7 Released:	3	December	2015 Previous	major	was ,	13	July	2004 Skipped	PHP	6:	Unicode	failure Last	release	is	(3	Aug	2017) PHP	5 7.1.8
PHP	7	PERFORMANCE PHP	7	is	also	faster	than !Python	3
BENCHMARK PHP	5.6 PHP	7 Memory	Usage 428	MB 33	MB Execution	time 0.49	sec 0.06	sec $a	=	[]; for	($i	=	0;	$i	<	1000000;	$i++)	{	$a[$i]	=	["hello"]; } echo	memory_get_usage(true);
MOVING	TO	PHP	7 Badoo	saved	one	million	dollars	switching	to	PHP 7	( ) Tumblr	reduced	the	latency	and	CPU	load	by	half moving	to	PHP	7	( ) Dailymotion	handles	twice	more	traffic	with same	infrastructure	switching	to	PHP	7	( ) source source source
PHP	7	IS	NOT	ONLY	FAST! Return	and	Scalar	Type	Declarations Improved	Exception	hierarchy Many	fatal	errors	converted	to	Exceptions Secure	random	number	generator Authenticated	encryption	AEAD	(PHP	7.1+) Nullable	types	(PHP	7.1+) and !more
WEB	APIS	IN	PHP	7
HTTP	IN/OUT
EXAMPLE Request: Response: GET	/api/version HTTP/1.1	200	OK Connection:	close Content-Length:	17 Content-Type:	application/json {	"version":	"1.0" }
MIDDLEWARE A	function	that	gets	a	request	and	generates	a response use	PsrHttpMessageServerRequestInterface	as	Request; use	InteropHttpServerMiddlewareDelegateInterface; function	(Request	$request,	DelegateInterface	$next) {	//	doing	something	with	$request...	//	for	instance	calling	the	delegate	middleware	$next	$response	=	$next->process($request);	//	manipulate	the	$response	return	$response; }
DELEGATEINTERFACE DelegateInterface	is	part	of	HTTP	Middleware	proposal namespace	InteropHttpServerMiddleware; use	PsrHttpMessageResponseInterface; use	PsrHttpMessageServerRequestInterface; interface	DelegateInterface {	/**	*	@return	ResponseInterface;	*/	public	function	process(ServerRequestInterface	$request); } PSR-15
EXPRESSIVE	2.0 The	PHP	framework	for	Middleware	applications PSR-7	HTTP	Message	support	(using ) Support	of	lambda	middleware	(PSR-15)	and double	pass	($request,	$response,	$next) Piping	workflow	(using ) Features:	routing,	dependency	injection, templating,	error	handling Last	release	2.0.3,	28th	March	2017 zend- diactoros zend-stratigility
INSTALLATION You	can	install	Expressive	2.0	using : Choose	the	default	options	during	the	installation composer composer	create-project	zendframework/zend-expressive-skeleton	api
DEFAULT The	skeleton	has	2	URL	as	example:	/	and /api/ping The	routes	are	registered	in	/config/routes.php The	middleware	actions	are	stored	in /src/App/Action
ROUTES /config/routes.php $app->get('/',	AppActionHomePageAction::class,	'home'); $app->get('/api/ping',	AppActionPingAction::class,	'api.ping');
API	MIDDLEWARE /src/App/Action/PingAction.php namespace	AppAction; use	InteropHttpServerMiddlewareDelegateInterface; use	InteropHttpServerMiddlewareMiddlewareInterface; use	ZendDiactorosResponseJsonResponse; use	PsrHttpMessageServerRequestInterface; class	PingAction	implements	MiddlewareInterface {	public	function	process(	ServerRequestInterface	$request,	DelegateInterface	$delegate	)	{	return	new	JsonResponse(['ack'	=>	time()]);	} }
PIPELINE	WORKFLOW /config/pipeline.php $app->pipe(ErrorHandler::class); $app->pipe(ServerUrlMiddleware::class); $app->pipeRoutingMiddleware(); $app->pipe(ImplicitHeadMiddleware::class); $app->pipe(ImplicitOptionsMiddleware::class); $app->pipe(UrlHelperMiddleware::class); $app->pipeDispatchMiddleware(); $app->pipe(NotFoundHandler::class);
SERVICE	CONTAINER /config/container.php use	ZendServiceManagerConfig; use	ZendServiceManagerServiceManager; $config	=	require	__DIR__	.	'/config.php'; $container	=	new	ServiceManager(); $config	=	new	Config($config['dependencies']); $config->configureServiceManager($container); $container->setService('config',	$config); return	$container;
THE	EXPRESSIVE	APP /public/index.php chdir(dirname(__DIR__)); require	'vendor/autoload.php'; call_user_func(function	()	{	$container	=	require	'config/container.php';	$app	=	$container->get(ZendExpressiveApplication::class	require	'config/pipeline.php';	require	'config/routes.php';	$app->run(); });
ROUTE	A	REST	API $app->route('/api/users[/{user-id}]',	[	AuthenticationAuthenticationMiddleware::class,	AuthorizationAuthorizationMiddleware::class,	ApiActionUserAction::class ],	['GET',	'POST',	'PATCH',	'DELETE'],	'api.users'); //	or	route	each	HTTP	method $app->get('/api/users[/{user-id}]',	...,	'api.users.get'); $app->post('/api/users',	...,	'api.users.post'); $app->patch('/api/users/{user-id}',	...,	'api.users.patch'); $app->delete('/api/users/{user-id}',	...,	'api.users.delete');
REST	DISPATCH	TRAIT use	PsrHttpMessageServerRequestInterface; use	InteropHttpServerMiddlewareDelegateInterface; trait	RestDispatchTrait {	public	function	process(	ServerRequestInterface	$request,	DelegateInterface	$delegate	)	{	$method	=	strtolower($request->getMethod());	if	(method_exists($this,	$method))	{	return	$this->$method($request);	}	return	$response->withStatus(501);	//	Method	not	implem	}
REST	MIDDLEWARE ApiActionUserAction.php class	UserAction	implements	MiddlewareInterface {	use	RestDispatchTrait;	public	function	get(ServerRequestInterface	$request)	{	$id	=	$request->getAttribute('user-id',	false);	$data	=	(false	===	$id)	?	/*	all	users	*/	:	/*	user	id	*/;	return	new	JsonResponse($data);	}	public	function	post(ServerRequestInterface	$request){	...	}	public	function	patch(ServerRequestInterface	$request){	...	}	public	function	delete(ServerRequestInterface	$request){	... }
DANKE	SCHÖN Slides:	http://5square.github.io/talks/ More	info: Contact	me:	jan.burkl	[at]	roguewave.com Follow	me: Credits: This	work	is	licensed	under	a . I	used	to	make	this	presentation. https://framework.zend.com/blog @janatzend @ezimuel Creative	Commons	Attribution-ShareAlike	3.0	Unported	License reveal.js

Middleware web APIs in PHP 7.x