SlideShare a Scribd company logo
1 of 67
Download to read offline
NewinSymfony4.xFeatures to take advantage of in eZ Platform v3.xโ€จ
โ€ฆ and eZ Platform v2.5 for back ported features
Andrรฉ Rรธmcke
@andrerom
Nicolas Grekas
@nicolasgrekas
Expert Sponsor : Avec le support de :Roadshow Sponsor :
About me
Some Honorable mentions
โ€ข Symfony Flex - 3.4/4.0
New, more advance way to handle projects and packages in Symfony.
โ€ข Lock Component - 3.4/4.0
Guarantee exclusive access to some shared resource. For example to ensure that a command
is not executed more than once at the same time (on the same or across different servers).
โ€ข Messenger Component - 4.1
Provides a message bus with the ability to send messages and then handle them immediately
in your application or send them through transports (e.g. queues) to be handled later on.
Symfony Maker Bundleโ€จ
Symfony Flex +Auto-wiring + Maker Bundle = โค
$ composer req maker
$ git diff config/bundles.php
Symfony Maker Bundle
$ ./bin/console list make
Symfony Maker Bundle
$ ./bin/console make:controller DefaultController
Symfony Maker Bundle
$ vim src/Controller/DefaultController.php
Symfony Maker Bundle
src/ is about YOUR code
$ composer req twig
Adding Twig to the controller
Symfony Cache Componentโ€จ
Some of the new features added in Symfony 4.xโ€จ
โ€ฆ and back ported to eZ Platform 2.5
New in Symfony Cache 4.2
โ€ข MarshallerInterface incl igbinary compatibility
โ€ข Multi-hosts DSN
โ€ข $cache->get($key, $callback, $beta = null)
Backported to eZ
Platform v2.5
4.2: Cache Stampede Protection at Warm-up
4.2: Cache Stampede Protection at expiry
$cache->get($key,	$callback,	$beta	=	null)	
Probabilistic early expiration:
โ€ข Between not favor (0), & highly favor (INF) early expiry
โ€ขBy default 1.0
โ€ข This will affect TTL on save
โ€ข Protects against lots of cache expiring at same time
New in Symfony Cache 4.3
โ€ข Optimized TagAware Redis & FileSystem adapters
โ€ข Stores tags as โ€œrelationโ€ => Avoids tag lookups on reads
โ€ข File => Symlinks for Tags
โ€ข Redis => Redis Set datatype for tags
โ€ข Memcached? => No control over eviction of tags
Part of eZ Platform v2.5,
contributed to Symfony 4.3
[Digression] New in eZ Platform 2.5: In-Memory cache
เน Domain specific, so not contributed to Symfony
เน Content (Content, Location, UrlAlias) is cached for 300ms
เน Meta data (Type, Section, User, Language) is cached for 3s
เน In both cases limit of 100 objects & LFU to pick what to clear
In sum 2.5 has greatly improved performance!
Especially	when	using	Redis!
Symfony HttpClient Componentโ€จ
Easy too use http client, web scrapper, api consumer, ..
by @nicolasgrekas & @andrerom
composer require symfony/http-client
use	SymfonyComponentHttpClientHttpClient;โ€จ
โ€จ
$client	=	HttpClient::create();โ€จ
โ€จ
$url	=	'https://symfony.com/versions.json';โ€จ
$response	=	$client->request('GET',	$url);โ€จ
by @nicolasgrekas & @andrerom
Consume JSON APIs in a snap
$symfonyVersions	=	$response->toArray();โ€จ
โ€จ
dump($symfonyVersions);โ€จ
array:23	[โ€จ
		"lts"	=>	"3.4.23"โ€จ
		"latest"	=>	"4.2.4"โ€จ
		"dev"	=>	"4.3.0-DEV"โ€จ
		"2.0"	=>	"2.0.25"โ€จ
		"2.1"	=>	"2.1.13"โ€จ
		"2.2"	=>	"2.2.11"	
		โ€ฆ
by @nicolasgrekas & @andrerom
namespace	SymfonyContractsHttpClient;โ€จ
โ€จ
//	Some	pieces	removed	to	not	spoil	the	talkโ€จ
โ€จ
interface	ResponseInterfaceโ€จ
{โ€จ
				public	function	getStatusCode():	int;โ€จ
				public	function	getHeaders():	array;โ€จ
				public	function	getContent():	string;โ€จ
				public	function	toArray():	array;โ€จ
}โ€จ
by @nicolasgrekas & @andrerom
The resiliency of the Web relies on redirects, youโ€™re part of it
Robust and failsafe by default
/**โ€จ
	*	Gets	the	HTTP	headers	of	the	response.โ€จ
	*โ€จ
	*	@param	bool	$throw	Whether	an	exception	should	be	thrown	on	3/4/5xx	status	codesโ€จ
	*โ€จ
	*	@throws	TransportExceptionInterface			When	a	network	error	occursโ€จ
	*	@throws	RedirectionExceptionInterface	On	a	3xx	when	$throw	is	true	and	the	
	*																																									"max_redirects"	option	has	been	reachedโ€จ
	*	@throws	ClientExceptionInterface						On	a	4xx	when	$throw	is	trueโ€จ
	*	@throws	ServerExceptionInterface						On	a	5xx	when	$throw	is	trueโ€จ
	*/โ€จ
public	function	getHeaders(bool	$throw	=	true):	array;
But what happens when the redirection limit is reached? or on 4xx / 5xx? Yours to decide:
by @nicolasgrekas & @andrerom
Abstraction	is	fully	decoupled	
from	the	component
Stateless	(autowired)	service
by @nicolasgrekas & @andrerom
Headers? Body? Options to the rescue
Options, there are a lot
of them!
by @nicolasgrekas & @andrerom
Bearer? JSON payload? Options to the rescue
by @nicolasgrekas & @andrerom
Optionstotherescue
'auth_basic'	=>	null,			//	array|string	-	an	array	containing	the	username	as	first	value,	and	optionally	theโ€จ
																								//			password	as	the	second	one;	or	string	like	username:password	-	enabling	HTTP	Basicโ€จ
																								//			authentication	(RFC	7617)โ€จ
'auth_bearer'	=>	null,		//	string	-	a	token	enabling	HTTP	Bearer	authorization	(RFC	6750)โ€จ
'query'	=>	[],										//	string[]	-	associative	array	of	query	string	values	to	merge	with	the	request's	URLโ€จ
'headers'	=>	[],								//	iterable|string[]|string[][]	-	headers	names	provided	as	keys	or	as	part	of	valuesโ€จ
'body'	=>	'',											//	array|string|resource|Traversable|Closure	-	the	callback	SHOULD	yield	a	stringโ€จ
																								//			smaller	than	the	amount	requested	as	argument;	the	empty	string	signals	EOF;	whenโ€จ
																								//			an	array	is	passed,	it	is	meant	as	a	form	payload	of	field	names	and	valuesโ€จ
'json'	=>	null,									//	array|JsonSerializable	-	when	set,	implementations	MUST	set	the	"body"	option	toโ€จ
																								//			the	JSON-encoded	value	and	set	the	"content-type"	headers	to	a	JSON-compatibleโ€จ
																								//			value	it	is	they	are	not	defined	-	typically	"application/json"โ€จ
'user_data'	=>	null,				//	mixed	-	any	extra	data	to	attach	to	the	request	(scalar,	callable,	object...)	thatโ€จ
																								//			MUST	be	available	via	$response->getInfo('user_data')	-	not	used	internallyโ€จ
'max_redirects'	=>	20,		//	int	-	the	maximum	number	of	redirects	to	follow;	a	value	lower	or	equal	to	0	meansโ€จ
																								//			redirects	should	not	be	followed;	"Authorization"	and	"Cookie"	headers	MUSTโ€จ
																								//			NOT	follow	except	for	the	initial	host	nameโ€จ
'http_version'	=>	null,	//	string	-	defaults	to	the	best	supported	version,	typically	1.1	or	2.0โ€จ
'base_uri'	=>	null,					//	string	-	the	URI	to	resolve	relative	URLs,	following	rules	in	RFC	3986,	section	2โ€จ
'buffer'	=>	true,							//	bool	-	whether	the	content	of	the	response	should	be	buffered	or	notโ€จ
'on_progress'	=>	null,		//	callable(int	$dlNow,	int	$dlSize,	array	$info)	-	throwing	any	exceptions	MUST	abortโ€จ
																								//			the	request;	it	MUST	be	called	on	DNS	resolution,	on	arrival	of	headers	and	onโ€จ
																								//			completion;	it	SHOULD	be	called	on	upload/download	of	data	and	at	least	1/sโ€จ
'resolve'	=>	[],								//	string[]	-	a	map	of	host	to	IP	address	that	SHOULD	replace	DNS	resolutionโ€จ
'proxy'	=>	null,								//	string	-	by	default,	the	proxy-related	env	vars	handled	by	curl	SHOULD	be	honoredโ€จ
'no_proxy'	=>	null,					//	string	-	a	comma	separated	list	of	hosts	that	do	not	require	a	proxy	to	be	reachedโ€จ
'timeout'	=>	null,						//	float	-	the	inactivity	timeout	-	defaults	to	ini_get('default_socket_timeout')โ€จ
'bindto'	=>	'0',								//	string	-	the	interface	or	the	local	socket	to	bind	toโ€จ
'verify_peer'	=>	true,		//	see	https://php.net/context.ssl	for	the	following	optionsโ€จ
'verify_host'	=>	true,โ€จ
'cafile'	=>	null,โ€จ
'capath'	=>	null,โ€จ
'local_cert'	=>	null,โ€จ
'local_pk'	=>	null,โ€จ
'passphrase'	=>	null,โ€จ
'ciphers'	=>	null,โ€จ
'peer_fingerprint'	=>	null,โ€จ
'capture_peer_cert_chain'	=>	false,โ€จ
'extra'	=>	[],										//	array	-	additional	options	that	can	be	ignored	if	unsupported,	unlike	regular	optionsโ€จ
by @nicolasgrekas & @andrerom
โ€ข proxy โ€“ get through an HTTP proxy	
โ€ข on_progress โ€“ display a progress bar / abort a request
โ€ข base_uri โ€“ resolve relative URLs / build a scoped client
โ€ข resolve โ€“ protect webhooks against calls to internal endpoints
โ€ข peer_fingerprint โ€“ pin public keys of remote certificates
โ€ข max_redirects โ€“ disable or limit redirects
Showcase of some options
by @nicolasgrekas & @andrerom
โ€ข body โ€“ array|string|resource|Traversable|Closure
Options: Streameable uploads using body
$client->request('POST',	'http://upload.example.com',	[โ€จ
				'body'	=>	$mimeParts->toIterable(),	//	e.g.	symfony/mime	(in	a	bit)โ€จ
]);โ€จ
by @nicolasgrekas & @andrerom
Options: Streameable downloads
$url	=	'http://releases.ubuntu.com/18.04.1/ubuntu-18.04.1-desktop-amd64.iso';โ€จ
$response	=	$client->request('GET',	$url,	[โ€จ
				'on_progress'	=>	'dump',	//	let's	spam	the	console	for	funโ€จ
				'buffer'	=>	false,	//	skip	buffering	the	response	in	memoryโ€จ
]);โ€จ
โ€จ
//	Responses	are	lazy!	This	waits	only	for	the	headersโ€จ
if	(200	!==	$response->getStatusCode())	{โ€จ
				throw	new	Exception('...');โ€จ
}โ€จ
โ€จ
$h	=	fopen('./ubuntu.iso',	'w');โ€จ
foreach	($client->stream($response)	as	$chunk)	{โ€จ
				fwrite($h,	$chunk->getContent());โ€จ
}โ€จ
by @nicolasgrekas & @andrerom
Responses are lazy & requests are concurrent
for	($i	=	0;	$i	<	379;	++$i)	{โ€จ
				$uri	=	"https://http2.akamai.com/demo/tile-$i.png";โ€จ
				$responses[]	=	$client->request('GET',	$uri);โ€จ
}โ€จ
โ€จ
foreach	($responses	as	$response)	{	
				//	block	until	completion	of	$response	
				//	but	monitor	all	other	responses	meanwhileโ€จ
				$response->getContent();	
}
by @nicolasgrekas & @andrerom
Asynchronous requests
for	($i	=	0;	$i	<	379;	++$i)	{โ€จ
				$uri	=	"https://http2.akamai.com/demo/tile-$i.png";โ€จ
				$responses[]	=	$client->request('GET',	$uri);โ€จ
}โ€จ
โ€จ
foreach	($client->stream($responses)	as	$response	=>	$chunk)	{โ€จ
				if	($chunk->isLast())	{โ€จ
								//	$response	completedโ€จ
				}	else	{โ€จ
								//	$response's	got	network	activity	or	timeoutโ€จ
				}โ€จ
}
โ€ข Note: $client->stream($responses,	0.0);
379 requests
completed in
0,4	s!
Max number of
seconds to wait
before yielding a
timeout chunk
by @nicolasgrekas & @andrerom
Symfony Provided Clients
โ€ข NativeHttpClient โ€“ The	most	portable,	uses	PHPโ€™s	HTTP	stream	wrapper	
โ€ข	CurlHttpClient โ€“ Multiplexing,	uses	HTTP/2	and	PUSH	when	available
Decorators:
โ€ข ScopingHttpClient โ€“ Auto-configure	the	options	based	on	the	request	URL	
โ€ข MockHttpClient โ€“ A	client	that	doesn't	make	actual	HTTP	requests	
โ€ข CachingHttpClient โ€“ Adds	caching	on	top	of	an	HTTP	client	
โ€ข Psr18Client โ€“ You	already	know	about	it	
โ€ข with	TraceableHttpClient	and	record	&	replay	coming
by @nicolasgrekas & @andrerom
Usage with FrameworkBundle / Autowiring
framework:โ€จ
				http_client:โ€จ
								max_host_connections:	4โ€จ
								default_options:โ€จ
												#	...โ€จ
								scoped_clients:โ€จ
												github_client:โ€จ
																base_uri:	https://api.github.comโ€จ
																headers:โ€จ
																				Authorization:	token	abc123โ€จ
#	creates	the	HttpClientInterface	$githubClient	autowiring	alias	
#	and	the	HttpClientInterface	$scopingHttpClient	oneโ€จ
by @nicolasgrekas & @andrerom
Usage with WebProfilerBundle
by @nicolasgrekas & @andrerom
Usage with BrowserKitHttpBrowser
use	SymfonyComponentBrowserKitHttpBrowser;โ€จ
use	SymfonyComponentHttpClientHttpClient;โ€จ
โ€จ
$client	=	HttpClient::create();โ€จ
$browser	=	new	HttpBrowser($client);โ€จ
โ€จ
$browser->request('GET',	'https://example.com/');โ€จ
$browser->clickLink('Log	In');โ€จ
$browser->submitForm('Sign	In',	['username'	=>	'me',	'password'	=>	'pass']);โ€จ
$browser->clickLink('Subscriptions')โ€จ
				->filter('table	tr:nth-child(2)	td:nth-child(2)')โ€จ
				->each(function	($node)	{	echo	trim($node->text())."n";	});
by @nicolasgrekas & @andrerom
			R.I.P.	Goutte
HttpClient
+ DomCrawler
+ CssSelector
+ HttpKernel
+ BrowserKit
Symfony Mime Componentโ€จ
Everything you need to create beautiful emails
use SymfonyComponentMimeEmail;
$email = (new Email())
->from('fabien@symfony.com')
->to('fabien@sensiolabs.com')
->subject('Some subject')
->text('Some text message')
->html('<b>Some HTML message</b>')
->attach('doc.txt')
;
The basics
Why is it so differentโ€จ
from Swiftmailer?
$email = (new Email())
->text('Some text message')
->html('<b>Some HTML message</b>')
;
$email = (new Swift_Message())
->setBody('Some text message')
->addPart('<b>Some HTML message</b>', 'text/html')
;
A better data object model
16k serialized
38 objects
complex serialization
"fixed" headers
2k serialized
7 objects
simple serialization
"dynamic" headers
echo $email->toString();
sleep(2);
$email->to('helene@symfony.com');
echo $email->toString();
Fixed vs dynamic headers
Differentโ€จ
set of headers
Date,Boundary,Message-ID
$email = (new Email())
->from('fabien@symfony.com')
->to('fabien@sensiolabs.com')
->subject('Some subject')
->text(fopen('email.txt', 'r'))
->html(fopen('email.html', 'r'))
;
echo $email->toString();
foreach ($email->toIterable() as $chunk) {
echo $chunk;
}
String or resources,your choice
$email
->attach('Some content', 'doc.txt', 'text/plain')
->attachFromPath('/path/to/doc.txt')
->attach(fopen('doc.txt', 'r'), 'doc.txt', 'text/plain')
;
Attachments
$email = (new Email())
->from('fabien@symfony.com')
->to('fabien@sensiolabs.com')
->subject('Some subject')
->text('Some text')
->html('<b>The new logo: <img src="cid:logo.jpg"></b>')
->embedFromPath('logo-small.jpg', 'logo.jpg')
;
Embeds
use SymfonyBridgeTwigMimeBodyRenderer;
use SymfonyBridgeTwigMimeTemplatedEmail;
use TwigEnvironment;
use TwigLoaderFilesystemLoader;
use SymfonyComponentMimeNamedAddress;
$twig = new Environment($loader = new FilesystemLoader(__DIR__.'/templates'));
$loader->addPath(__DIR__.'/images', 'images');
$email = (new TemplatedEmail())
->from('fabien@symfony.com')
->to(new NamedAddress('fabien@sensiolabs.com', 'Fabien'))
->text('Some text content')
->htmlTemplate('simple.html.twig')
->context([
'city' => 'Lille'
])
;
$renderer = new BodyRenderer($twig);
$renderer->render($email);
echo $email->toString();
Native integration with Twig
<p>
Welcome <b>{{ email.toName }}</b> from {{ city }}!
</p>
<p>
<img src="{{ email.image('@images/photo.jpg') }}">
</p>
Native integration with Twig
SymfonyBridgeTwigMime
WrappedTemplatedEmail
Twig template name
Template context
{% do email.attach('@docs/doc.pdf') %}
<p>
Welcome <b>{{ email.toName }}</b>!
</p>
<p>
<img src="{{ email.image('@images/photo.jpg') }}">
</p>
Native integration with Twig
{% do email.priority(5) %}
<p>
Welcome <b>{{ email.toName }}</b>!
</p>
<p>
<img src="{{ email.image('@images/photo.jpg') }}">
</p>
Native integration with Twig
$email = (new TemplatedEmail())
->from('fabien@symfony.com')
->to(new NamedAddress('fabien@sensiolabs.com', 'Fabien'))
->textTemplate('simple.txt.twig')
->htmlTemplate('simple.html.twig')
;
Native integration with Twig
Tip!
If the Text part is empty,
the BodyRenderer automatically generates one
use TwigCssInlinerCssInlinerExtension;
$twig->addExtension(new CssInlinerExtension());
{% apply inline_css %}
<style>
b { color: red }
</style>
<p>
Welcome <b>{{ email.toName }}</b>!
</p>
{% endapply %}
Inlining CSS
{% apply inline_css("@css/email.css") %}
<style>
b { color: red }
</style>
<p>
Welcome <b>{{ email.toName }}</b>!
</p>
{% endapply %}
Inlining CSS
use TwigMarkdownMarkdownExtension;
$twig->addExtension(new MarkdownExtension());
<p>
{% apply markdown %}
| Version | LTS? | Latest |
| ------------- |:-------------:| -------:|
| 1.0 | Yes | 1.0.1 |
| 2.1 | No | 2.1.33 |
{% endapply %}
</p>
Use Markdown to simplify your templates
use TwigInkyInkyExtension;
$twig->addExtension(new InkyExtension());
Use Inky to simplify your HTML
https://foundation.zurb.com/emails.html
{% apply inky|inline_css(source("@zurb/stylesheets/main.css")) %}
<container>
<row class="header">
<columns>
<spacer size="16"></spacer>
<h4 class="text-center">Symfony Connect</h4>
</columns>
</row>
<row>
<columns>
<spacer size="32"></spacer>
<center><img width="100px" src="{{ email.image("@images/symfony.png") }}"></center>
<spacer size="16"></spacer>
<h1 class="text-center">Forgot Your Password?</h1>
<spacer size="16"></spacer>
<p class="text-center">It happens. Click the link below to reset it.</p>
<button class="large expand" href="#">Reset Password</button>
<hr/>
<p><small><center><a href="#">unsubscribe here</a>.</small></center></p>
</columns>
</row>
</container>
{% endapply %}
Use Inky to simplify your HTML
Symfony Mailer Componentโ€จ
Everything you need to send emails
use SymfonyComponentMailerTransportSmtpSmtpTransport;โ€จ
โ€จ
$transport = new SmtpTransport('localhost');
$transport->send($email);
The basics
Email is sent for
everybody

or not at all
use SymfonyComponentMailerBridgeAmazoneSmtpSesTransport;
use SymfonyComponentMailerBridgeGoogleSmtpGmailTransport;
use SymfonyComponentMailerBridgeMailchimpSmtpMandrillTransport;
use SymfonyComponentMailerBridgeMailgunSmtpMailgunTransport;
use SymfonyComponentMailerBridgePostmarkSmtpPostmarkTransport;
use SymfonyComponentMailerBridgeSendgridSmtpSendgridTransport;
new SesTransport('user', 'pass', 'eu-west-1');
new GmailTransport('user', 'pass');
new MandrillTransport('user', 'pass');
new MailgunTransport('user', 'pass');
new PostmarkTransport(โ€˜key');
new SendgridTransport('key');
SMTP: Shortcuts
use SymfonyComponentMailerBridgeMailgunHttpMailgunTransport;
new MailgunTransport(โ€˜keyโ€™, โ€˜domain');
โ€ฆ also for Amazone SES & Mandrill
HTTP: Raw message
use SymfonyComponentMailerBridgeMailgunHttpApiMailgunTransport;
use SymfonyComponentMailerBridgePostmarkHttpApiPostmarkTransport;
new MailgunTransport(โ€˜key', โ€˜domain');
new PostmarkTransport(โ€˜keyโ€™);
โ€ฆ also for Amazone SES, Mandrill & Sendgrid
HTTP: Via API
SMTP / HTTP / API?
SMTP HTTP API
Offline Yes	via	Mailcatcher No	/	Mock No	/	Mock
Mailcatcher Yes No No
Standard Yes No No
Symfony	generated Yes Yes No
Fast No Yes Yes
Transport::fromDsn('...');
smtp://user:pass@gmail
smtp://key@sendgrid
smtp://null
smtp://user:pass@mailgun
http://key:domain@mailgun
api://id@postmark
Use a DSN
Transport::fromDsn('...');
Failover
api://id@postmark || smtp://key@sendgrid
RoundRobin
api://id@postmark && smtp://key@sendgrid
Failover and RoundRobin transports
public function email(TransportInterface $transport)
{
$email = (new Email())->โ€ฆ;
$transport->send($email);
return new Response('Sent');
}
Sending emails
Go async?
// Under the hood this is done when async
$transport = Transport::fromDsn('smtp://localhost'));
$transport->send($email);
โ€จ
$bus->dispatch($email);
Messages via Messenger
Emails are sent async via AMQP
framework:
messenger:
routing:
'SymfonyComponentMailerEnvelopedMessage': amqp
Emails are sent immediately
framework:
messenger:
routing:
#'SymfonyComponentMailerEnvelopedMessage': amqp
Sync or Async,your choice
Leveragesโ€จ
the Symfony ecosystem
Twig
Encore
Serializer
Messenger
PSR logger
CSS selector
Event Dispatcher
Dependency Injection Container
Symfony Polyfills (punycode, intl, โ€ฆ)
โ€ฆ with all the great features you love in Swiftmailer 6
Symfony Mailer
Thank you! โค

More Related Content

What's hot

Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
Rafael Dohms
ย 
"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg
"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg
"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg
PROIDEA
ย 

What's hot (20)

PHP: The Beginning and the Zend
PHP: The Beginning and the ZendPHP: The Beginning and the Zend
PHP: The Beginning and the Zend
ย 
Static PIE, How and Why - Metasploit's new POSIX payload: Mettle
Static PIE, How and Why - Metasploit's new POSIX payload: MettleStatic PIE, How and Why - Metasploit's new POSIX payload: Mettle
Static PIE, How and Why - Metasploit's new POSIX payload: Mettle
ย 
Nagios Conference 2011 - Mike Weber - Training: Monitoring Linux Mail Servers...
Nagios Conference 2011 - Mike Weber - Training: Monitoring Linux Mail Servers...Nagios Conference 2011 - Mike Weber - Training: Monitoring Linux Mail Servers...
Nagios Conference 2011 - Mike Weber - Training: Monitoring Linux Mail Servers...
ย 
Dockerffm meetup 20150113_networking
Dockerffm meetup 20150113_networkingDockerffm meetup 20150113_networking
Dockerffm meetup 20150113_networking
ย 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
ย 
Docker Security in Production Overview
Docker Security in Production OverviewDocker Security in Production Overview
Docker Security in Production Overview
ย 
Running Symfony
Running SymfonyRunning Symfony
Running Symfony
ย 
Massive emailing with Linux, Postfix and Ruby on Rails
Massive emailing with Linux, Postfix and Ruby on RailsMassive emailing with Linux, Postfix and Ruby on Rails
Massive emailing with Linux, Postfix and Ruby on Rails
ย 
AWS Update | London - Elastic Beanstalk
AWS Update | London - Elastic BeanstalkAWS Update | London - Elastic Beanstalk
AWS Update | London - Elastic Beanstalk
ย 
The Dirty Little Secrets They Didnโ€™t Teach You In Pentesting Class
The Dirty Little Secrets They Didnโ€™t Teach You In Pentesting ClassThe Dirty Little Secrets They Didnโ€™t Teach You In Pentesting Class
The Dirty Little Secrets They Didnโ€™t Teach You In Pentesting Class
ย 
Docker in 30 minutes
Docker in 30 minutesDocker in 30 minutes
Docker in 30 minutes
ย 
Increasing Reuse and Time to Awesome by Using Flux Packages | Nathaniel Cook ...
Increasing Reuse and Time to Awesome by Using Flux Packages | Nathaniel Cook ...Increasing Reuse and Time to Awesome by Using Flux Packages | Nathaniel Cook ...
Increasing Reuse and Time to Awesome by Using Flux Packages | Nathaniel Cook ...
ย 
Composer the right way - SunshinePHP
Composer the right way - SunshinePHPComposer the right way - SunshinePHP
Composer the right way - SunshinePHP
ย 
Incorporating PowerShell into your Arsenal with PS>Attack
Incorporating PowerShell into your Arsenal with PS>AttackIncorporating PowerShell into your Arsenal with PS>Attack
Incorporating PowerShell into your Arsenal with PS>Attack
ย 
DockerCon 18 docker storage
DockerCon 18 docker storageDockerCon 18 docker storage
DockerCon 18 docker storage
ย 
Hacking in shadows By - Raghav Bisht
Hacking in shadows By - Raghav BishtHacking in shadows By - Raghav Bisht
Hacking in shadows By - Raghav Bisht
ย 
"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg
"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg
"Playing in the Sandbox: Adobe Flash Exploitation Tales" - Bjรถrn Ruytenberg
ย 
Network configuration
Network configurationNetwork configuration
Network configuration
ย 
Speech for Windows Phone 8
Speech for Windows Phone 8Speech for Windows Phone 8
Speech for Windows Phone 8
ย 
Apache FTP Server Integration
Apache FTP Server IntegrationApache FTP Server Integration
Apache FTP Server Integration
ย 

Similar to Symfony 4.0 + - Track Technique eZ Roadshow 2019 - PARIS

Introduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationIntroduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android Application
Kelwin Yang
ย 
Symfony Components 2.0 on PHP 5.3
Symfony Components 2.0 on PHP 5.3Symfony Components 2.0 on PHP 5.3
Symfony Components 2.0 on PHP 5.3
Fabien Potencier
ย 
Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability Systems
Marcelo Pinheiro
ย 

Similar to Symfony 4.0 + - Track Technique eZ Roadshow 2019 - PARIS (20)

Symfony finally swiped right on envvars
Symfony finally swiped right on envvarsSymfony finally swiped right on envvars
Symfony finally swiped right on envvars
ย 
Grรขce aux tags Varnish, j'ai switchรฉ ma prod sur Raspberry Pi
Grรขce aux tags Varnish, j'ai switchรฉ ma prod sur Raspberry PiGrรขce aux tags Varnish, j'ai switchรฉ ma prod sur Raspberry Pi
Grรขce aux tags Varnish, j'ai switchรฉ ma prod sur Raspberry Pi
ย 
Introduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android ApplicationIntroduction to Dynamic Analysis of Android Application
Introduction to Dynamic Analysis of Android Application
ย 
The use of Symfony2 @ Overblog
The use of Symfony2 @ OverblogThe use of Symfony2 @ Overblog
The use of Symfony2 @ Overblog
ย 
Symfony Components 2.0 on PHP 5.3
Symfony Components 2.0 on PHP 5.3Symfony Components 2.0 on PHP 5.3
Symfony Components 2.0 on PHP 5.3
ย 
1000 to 0
1000 to 01000 to 0
1000 to 0
ย 
Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725
ย 
Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725
ย 
Infrastructure as code: running microservices on AWS using Docker, Terraform,...
Infrastructure as code: running microservices on AWS using Docker, Terraform,...Infrastructure as code: running microservices on AWS using Docker, Terraform,...
Infrastructure as code: running microservices on AWS using Docker, Terraform,...
ย 
Symfony2 revealed
Symfony2 revealedSymfony2 revealed
Symfony2 revealed
ย 
Symfony 4: A new way to develop applications #phpsrb
 Symfony 4: A new way to develop applications #phpsrb Symfony 4: A new way to develop applications #phpsrb
Symfony 4: A new way to develop applications #phpsrb
ย 
PHP Dependency Management with Composer
PHP Dependency Management with ComposerPHP Dependency Management with Composer
PHP Dependency Management with Composer
ย 
Privilege Escalation with Metasploit
Privilege Escalation with MetasploitPrivilege Escalation with Metasploit
Privilege Escalation with Metasploit
ย 
New features in Ruby 2.5
New features in Ruby 2.5New features in Ruby 2.5
New features in Ruby 2.5
ย 
Docker storage designing a platform for persistent data
Docker storage designing a platform for persistent dataDocker storage designing a platform for persistent data
Docker storage designing a platform for persistent data
ย 
Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability Systems
ย 
Fabien Potencier "Symfony 4 in action"
Fabien Potencier "Symfony 4 in action"Fabien Potencier "Symfony 4 in action"
Fabien Potencier "Symfony 4 in action"
ย 
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus...TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus...
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
ย 
The Golden Ticket: Docker and High Security Microservices by Aaron Grattafiori
The Golden Ticket: Docker and High Security Microservices by Aaron GrattafioriThe Golden Ticket: Docker and High Security Microservices by Aaron Grattafiori
The Golden Ticket: Docker and High Security Microservices by Aaron Grattafiori
ย 
RHCE (RED HAT CERTIFIED ENGINEERING)
RHCE (RED HAT CERTIFIED ENGINEERING)RHCE (RED HAT CERTIFIED ENGINEERING)
RHCE (RED HAT CERTIFIED ENGINEERING)
ย 

More from eZ Systems

More from eZ Systems (20)

A unified platform to build Digital Experience from Content to Commerce to Pe...
A unified platform to build Digital Experience from Content to Commerce to Pe...A unified platform to build Digital Experience from Content to Commerce to Pe...
A unified platform to build Digital Experience from Content to Commerce to Pe...
ย 
"Reconociendo al cliente personalizando su experiencia" - Andorra Turisme - e...
"Reconociendo al cliente personalizando su experiencia" - Andorra Turisme - e..."Reconociendo al cliente personalizando su experiencia" - Andorra Turisme - e...
"Reconociendo al cliente personalizando su experiencia" - Andorra Turisme - e...
ย 
"How Crรฉdit Agricole and IT-CE managed their digital transformation thanks to...
"How Crรฉdit Agricole and IT-CE managed their digital transformation thanks to..."How Crรฉdit Agricole and IT-CE managed their digital transformation thanks to...
"How Crรฉdit Agricole and IT-CE managed their digital transformation thanks to...
ย 
The rise of Digital Experience Platforms
The rise of Digital Experience PlatformsThe rise of Digital Experience Platforms
The rise of Digital Experience Platforms
ย 
"How to deliver remarkable digital experiences to customers?"
"How to deliver remarkable digital experiences to customers?""How to deliver remarkable digital experiences to customers?"
"How to deliver remarkable digital experiences to customers?"
ย 
Keynote eZ Roadshow & Diginight 2019 - oslo
Keynote eZ Roadshow & Diginight 2019 - osloKeynote eZ Roadshow & Diginight 2019 - oslo
Keynote eZ Roadshow & Diginight 2019 - oslo
ย 
Brochure eZ Platform DXP
Brochure eZ Platform DXPBrochure eZ Platform DXP
Brochure eZ Platform DXP
ย 
[Webinar] Discover eZ platform v2.4
[Webinar]  Discover eZ platform v2.4[Webinar]  Discover eZ platform v2.4
[Webinar] Discover eZ platform v2.4
ย 
Community webinar discover e z platform v2.3 (9.10.2018)
Community webinar   discover e z platform v2.3 (9.10.2018)Community webinar   discover e z platform v2.3 (9.10.2018)
Community webinar discover e z platform v2.3 (9.10.2018)
ย 
Symfony Under the Hood
Symfony Under the HoodSymfony Under the Hood
Symfony Under the Hood
ย 
eZ in the Year Ahead
eZ in the Year AheadeZ in the Year Ahead
eZ in the Year Ahead
ย 
Personalization on eZ Platform v2
Personalization on eZ Platform v2Personalization on eZ Platform v2
Personalization on eZ Platform v2
ย 
Choose the eZ Universe for Your Web Galaxy
Choose the eZ Universe for Your Web GalaxyChoose the eZ Universe for Your Web Galaxy
Choose the eZ Universe for Your Web Galaxy
ย 
Using eZ Platform in an API Era
Using eZ Platform in an API EraUsing eZ Platform in an API Era
Using eZ Platform in an API Era
ย 
Extending eZ Platform v2 with Symfony and React
Extending eZ Platform v2 with Symfony and ReactExtending eZ Platform v2 with Symfony and React
Extending eZ Platform v2 with Symfony and React
ย 
A Roadmap to Becoming Your Customerโ€™s Information Hub
A Roadmap to Becoming Your Customerโ€™s Information HubA Roadmap to Becoming Your Customerโ€™s Information Hub
A Roadmap to Becoming Your Customerโ€™s Information Hub
ย 
eZ Platform Cloud and eZ Launchpad: Donโ€™t Host, Donโ€™t Deploy, Donโ€™t Installโ€”J...
eZ Platform Cloud and eZ Launchpad: Donโ€™t Host, Donโ€™t Deploy, Donโ€™t Installโ€”J...eZ Platform Cloud and eZ Launchpad: Donโ€™t Host, Donโ€™t Deploy, Donโ€™t Installโ€”J...
eZ Platform Cloud and eZ Launchpad: Donโ€™t Host, Donโ€™t Deploy, Donโ€™t Installโ€”J...
ย 
GDPR in the Digital World
GDPR in the Digital WorldGDPR in the Digital World
GDPR in the Digital World
ย 
When content transforms your customer experience
When content transforms your customer experienceWhen content transforms your customer experience
When content transforms your customer experience
ย 
Connectors Panel Discussion
Connectors Panel DiscussionConnectors Panel Discussion
Connectors Panel Discussion
ย 

Recently uploaded

Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
soniya singh
ย 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
ย 
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
ย 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
ellan12
ย 
CALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service Online
CALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service OnlineCALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service Online
CALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service Online
anilsa9823
ย 
VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting High Prof...
VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting  High Prof...VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting  High Prof...
VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting High Prof...
singhpriety023
ย 
โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...
โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...
โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...
Diya Sharma
ย 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
sexy call girls service in goa
ย 
Lucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRL
Lucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRLLucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRL
Lucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRL
imonikaupta
ย 
Delhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip CallDelhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip Call
shivangimorya083
ย 
@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ
@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ
@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
ย 

Recently uploaded (20)

DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
ย 
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
Russian Call Girls in %(+971524965298  )#  Call Girls in DubaiRussian Call Girls in %(+971524965298  )#  Call Girls in Dubai
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
ย 
Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls In Ashram Chowk Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
ย 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
ย 
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
ย 
How is AI changing journalism? (v. April 2024)
How is AI changing journalism? (v. April 2024)How is AI changing journalism? (v. April 2024)
How is AI changing journalism? (v. April 2024)
ย 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
ย 
(+971568250507 ))# Young Call Girls in Ajman By Pakistani Call Girls in ...
(+971568250507  ))#  Young Call Girls  in Ajman  By Pakistani Call Girls  in ...(+971568250507  ))#  Young Call Girls  in Ajman  By Pakistani Call Girls  in ...
(+971568250507 ))# Young Call Girls in Ajman By Pakistani Call Girls in ...
ย 
CALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service Online
CALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service OnlineCALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service Online
CALL ON โžฅ8923113531 ๐Ÿ”Call Girls Lucknow Lucknow best sexual service Online
ย 
VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting High Prof...
VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting  High Prof...VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting  High Prof...
VIP Model Call Girls Hadapsar ( Pune ) Call ON 9905417584 Starting High Prof...
ย 
โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...
โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...
โ‚น5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] ๐Ÿ”|97111...
ย 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
ย 
Call Now โ˜Ž 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now โ˜Ž 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.Call Now โ˜Ž 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now โ˜Ž 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
ย 
Lucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRL
Lucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRLLucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRL
Lucknow โคCALL GIRL 88759*99948 โคCALL GIRLS IN Lucknow ESCORT SERVICEโคCALL GIRL
ย 
Hireโ† Young Call Girls in Tilak nagar (Delhi) โ˜Ž๏ธ 9205541914 โ˜Ž๏ธ Independent Esc...
Hireโ† Young Call Girls in Tilak nagar (Delhi) โ˜Ž๏ธ 9205541914 โ˜Ž๏ธ Independent Esc...Hireโ† Young Call Girls in Tilak nagar (Delhi) โ˜Ž๏ธ 9205541914 โ˜Ž๏ธ Independent Esc...
Hireโ† Young Call Girls in Tilak nagar (Delhi) โ˜Ž๏ธ 9205541914 โ˜Ž๏ธ Independent Esc...
ย 
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebGDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
ย 
Delhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip CallDelhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 โ˜Žโœ”๐Ÿ‘Œโœ” Whatsapp Hard And Sexy Vip Call
ย 
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
ย 
WhatsApp ๐Ÿ“ž 8448380779 โœ…Call Girls In Mamura Sector 66 ( Noida)
WhatsApp ๐Ÿ“ž 8448380779 โœ…Call Girls In Mamura Sector 66 ( Noida)WhatsApp ๐Ÿ“ž 8448380779 โœ…Call Girls In Mamura Sector 66 ( Noida)
WhatsApp ๐Ÿ“ž 8448380779 โœ…Call Girls In Mamura Sector 66 ( Noida)
ย 
@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ
@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ
@9999965857 ๐Ÿซฆ Sexy Desi Call Girls Laxmi Nagar ๐Ÿ’“ High Profile Escorts Delhi ๐Ÿซถ
ย 

Symfony 4.0 + - Track Technique eZ Roadshow 2019 - PARIS

  • 1. NewinSymfony4.xFeatures to take advantage of in eZ Platform v3.xโ€จ โ€ฆ and eZ Platform v2.5 for back ported features Andrรฉ Rรธmcke @andrerom Nicolas Grekas @nicolasgrekas Expert Sponsor : Avec le support de :Roadshow Sponsor :
  • 3. Some Honorable mentions โ€ข Symfony Flex - 3.4/4.0 New, more advance way to handle projects and packages in Symfony. โ€ข Lock Component - 3.4/4.0 Guarantee exclusive access to some shared resource. For example to ensure that a command is not executed more than once at the same time (on the same or across different servers). โ€ข Messenger Component - 4.1 Provides a message bus with the ability to send messages and then handle them immediately in your application or send them through transports (e.g. queues) to be handled later on.
  • 4. Symfony Maker Bundleโ€จ Symfony Flex +Auto-wiring + Maker Bundle = โค
  • 5. $ composer req maker $ git diff config/bundles.php Symfony Maker Bundle
  • 6. $ ./bin/console list make Symfony Maker Bundle
  • 7. $ ./bin/console make:controller DefaultController Symfony Maker Bundle
  • 8. $ vim src/Controller/DefaultController.php Symfony Maker Bundle src/ is about YOUR code
  • 9. $ composer req twig Adding Twig to the controller
  • 10. Symfony Cache Componentโ€จ Some of the new features added in Symfony 4.xโ€จ โ€ฆ and back ported to eZ Platform 2.5
  • 11. New in Symfony Cache 4.2 โ€ข MarshallerInterface incl igbinary compatibility โ€ข Multi-hosts DSN โ€ข $cache->get($key, $callback, $beta = null) Backported to eZ Platform v2.5
  • 12. 4.2: Cache Stampede Protection at Warm-up
  • 13. 4.2: Cache Stampede Protection at expiry $cache->get($key, $callback, $beta = null) Probabilistic early expiration: โ€ข Between not favor (0), & highly favor (INF) early expiry โ€ขBy default 1.0 โ€ข This will affect TTL on save โ€ข Protects against lots of cache expiring at same time
  • 14. New in Symfony Cache 4.3 โ€ข Optimized TagAware Redis & FileSystem adapters โ€ข Stores tags as โ€œrelationโ€ => Avoids tag lookups on reads โ€ข File => Symlinks for Tags โ€ข Redis => Redis Set datatype for tags โ€ข Memcached? => No control over eviction of tags Part of eZ Platform v2.5, contributed to Symfony 4.3
  • 15. [Digression] New in eZ Platform 2.5: In-Memory cache เน Domain specific, so not contributed to Symfony เน Content (Content, Location, UrlAlias) is cached for 300ms เน Meta data (Type, Section, User, Language) is cached for 3s เน In both cases limit of 100 objects & LFU to pick what to clear In sum 2.5 has greatly improved performance! Especially when using Redis!
  • 16. Symfony HttpClient Componentโ€จ Easy too use http client, web scrapper, api consumer, ..
  • 17. by @nicolasgrekas & @andrerom composer require symfony/http-client use SymfonyComponentHttpClientHttpClient;โ€จ โ€จ $client = HttpClient::create();โ€จ โ€จ $url = 'https://symfony.com/versions.json';โ€จ $response = $client->request('GET', $url);โ€จ
  • 18. by @nicolasgrekas & @andrerom Consume JSON APIs in a snap $symfonyVersions = $response->toArray();โ€จ โ€จ dump($symfonyVersions);โ€จ array:23 [โ€จ "lts" => "3.4.23"โ€จ "latest" => "4.2.4"โ€จ "dev" => "4.3.0-DEV"โ€จ "2.0" => "2.0.25"โ€จ "2.1" => "2.1.13"โ€จ "2.2" => "2.2.11" โ€ฆ
  • 19. by @nicolasgrekas & @andrerom namespace SymfonyContractsHttpClient;โ€จ โ€จ // Some pieces removed to not spoil the talkโ€จ โ€จ interface ResponseInterfaceโ€จ {โ€จ public function getStatusCode(): int;โ€จ public function getHeaders(): array;โ€จ public function getContent(): string;โ€จ public function toArray(): array;โ€จ }โ€จ
  • 20. by @nicolasgrekas & @andrerom The resiliency of the Web relies on redirects, youโ€™re part of it Robust and failsafe by default /**โ€จ * Gets the HTTP headers of the response.โ€จ *โ€จ * @param bool $throw Whether an exception should be thrown on 3/4/5xx status codesโ€จ *โ€จ * @throws TransportExceptionInterface When a network error occursโ€จ * @throws RedirectionExceptionInterface On a 3xx when $throw is true and the * "max_redirects" option has been reachedโ€จ * @throws ClientExceptionInterface On a 4xx when $throw is trueโ€จ * @throws ServerExceptionInterface On a 5xx when $throw is trueโ€จ */โ€จ public function getHeaders(bool $throw = true): array; But what happens when the redirection limit is reached? or on 4xx / 5xx? Yours to decide:
  • 21. by @nicolasgrekas & @andrerom Abstraction is fully decoupled from the component Stateless (autowired) service
  • 22. by @nicolasgrekas & @andrerom Headers? Body? Options to the rescue Options, there are a lot of them!
  • 23. by @nicolasgrekas & @andrerom Bearer? JSON payload? Options to the rescue
  • 24. by @nicolasgrekas & @andrerom Optionstotherescue 'auth_basic' => null, // array|string - an array containing the username as first value, and optionally theโ€จ // password as the second one; or string like username:password - enabling HTTP Basicโ€จ // authentication (RFC 7617)โ€จ 'auth_bearer' => null, // string - a token enabling HTTP Bearer authorization (RFC 6750)โ€จ 'query' => [], // string[] - associative array of query string values to merge with the request's URLโ€จ 'headers' => [], // iterable|string[]|string[][] - headers names provided as keys or as part of valuesโ€จ 'body' => '', // array|string|resource|Traversable|Closure - the callback SHOULD yield a stringโ€จ // smaller than the amount requested as argument; the empty string signals EOF; whenโ€จ // an array is passed, it is meant as a form payload of field names and valuesโ€จ 'json' => null, // array|JsonSerializable - when set, implementations MUST set the "body" option toโ€จ // the JSON-encoded value and set the "content-type" headers to a JSON-compatibleโ€จ // value it is they are not defined - typically "application/json"โ€จ 'user_data' => null, // mixed - any extra data to attach to the request (scalar, callable, object...) thatโ€จ // MUST be available via $response->getInfo('user_data') - not used internallyโ€จ 'max_redirects' => 20, // int - the maximum number of redirects to follow; a value lower or equal to 0 meansโ€จ // redirects should not be followed; "Authorization" and "Cookie" headers MUSTโ€จ // NOT follow except for the initial host nameโ€จ 'http_version' => null, // string - defaults to the best supported version, typically 1.1 or 2.0โ€จ 'base_uri' => null, // string - the URI to resolve relative URLs, following rules in RFC 3986, section 2โ€จ 'buffer' => true, // bool - whether the content of the response should be buffered or notโ€จ 'on_progress' => null, // callable(int $dlNow, int $dlSize, array $info) - throwing any exceptions MUST abortโ€จ // the request; it MUST be called on DNS resolution, on arrival of headers and onโ€จ // completion; it SHOULD be called on upload/download of data and at least 1/sโ€จ 'resolve' => [], // string[] - a map of host to IP address that SHOULD replace DNS resolutionโ€จ 'proxy' => null, // string - by default, the proxy-related env vars handled by curl SHOULD be honoredโ€จ 'no_proxy' => null, // string - a comma separated list of hosts that do not require a proxy to be reachedโ€จ 'timeout' => null, // float - the inactivity timeout - defaults to ini_get('default_socket_timeout')โ€จ 'bindto' => '0', // string - the interface or the local socket to bind toโ€จ 'verify_peer' => true, // see https://php.net/context.ssl for the following optionsโ€จ 'verify_host' => true,โ€จ 'cafile' => null,โ€จ 'capath' => null,โ€จ 'local_cert' => null,โ€จ 'local_pk' => null,โ€จ 'passphrase' => null,โ€จ 'ciphers' => null,โ€จ 'peer_fingerprint' => null,โ€จ 'capture_peer_cert_chain' => false,โ€จ 'extra' => [], // array - additional options that can be ignored if unsupported, unlike regular optionsโ€จ
  • 25. by @nicolasgrekas & @andrerom โ€ข proxy โ€“ get through an HTTP proxy โ€ข on_progress โ€“ display a progress bar / abort a request โ€ข base_uri โ€“ resolve relative URLs / build a scoped client โ€ข resolve โ€“ protect webhooks against calls to internal endpoints โ€ข peer_fingerprint โ€“ pin public keys of remote certificates โ€ข max_redirects โ€“ disable or limit redirects Showcase of some options
  • 26. by @nicolasgrekas & @andrerom โ€ข body โ€“ array|string|resource|Traversable|Closure Options: Streameable uploads using body $client->request('POST', 'http://upload.example.com', [โ€จ 'body' => $mimeParts->toIterable(), // e.g. symfony/mime (in a bit)โ€จ ]);โ€จ
  • 27. by @nicolasgrekas & @andrerom Options: Streameable downloads $url = 'http://releases.ubuntu.com/18.04.1/ubuntu-18.04.1-desktop-amd64.iso';โ€จ $response = $client->request('GET', $url, [โ€จ 'on_progress' => 'dump', // let's spam the console for funโ€จ 'buffer' => false, // skip buffering the response in memoryโ€จ ]);โ€จ โ€จ // Responses are lazy! This waits only for the headersโ€จ if (200 !== $response->getStatusCode()) {โ€จ throw new Exception('...');โ€จ }โ€จ โ€จ $h = fopen('./ubuntu.iso', 'w');โ€จ foreach ($client->stream($response) as $chunk) {โ€จ fwrite($h, $chunk->getContent());โ€จ }โ€จ
  • 28. by @nicolasgrekas & @andrerom Responses are lazy & requests are concurrent for ($i = 0; $i < 379; ++$i) {โ€จ $uri = "https://http2.akamai.com/demo/tile-$i.png";โ€จ $responses[] = $client->request('GET', $uri);โ€จ }โ€จ โ€จ foreach ($responses as $response) { // block until completion of $response // but monitor all other responses meanwhileโ€จ $response->getContent(); }
  • 29. by @nicolasgrekas & @andrerom Asynchronous requests for ($i = 0; $i < 379; ++$i) {โ€จ $uri = "https://http2.akamai.com/demo/tile-$i.png";โ€จ $responses[] = $client->request('GET', $uri);โ€จ }โ€จ โ€จ foreach ($client->stream($responses) as $response => $chunk) {โ€จ if ($chunk->isLast()) {โ€จ // $response completedโ€จ } else {โ€จ // $response's got network activity or timeoutโ€จ }โ€จ } โ€ข Note: $client->stream($responses, 0.0); 379 requests completed in 0,4 s! Max number of seconds to wait before yielding a timeout chunk
  • 30. by @nicolasgrekas & @andrerom Symfony Provided Clients โ€ข NativeHttpClient โ€“ The most portable, uses PHPโ€™s HTTP stream wrapper โ€ข CurlHttpClient โ€“ Multiplexing, uses HTTP/2 and PUSH when available Decorators: โ€ข ScopingHttpClient โ€“ Auto-configure the options based on the request URL โ€ข MockHttpClient โ€“ A client that doesn't make actual HTTP requests โ€ข CachingHttpClient โ€“ Adds caching on top of an HTTP client โ€ข Psr18Client โ€“ You already know about it โ€ข with TraceableHttpClient and record & replay coming
  • 31. by @nicolasgrekas & @andrerom Usage with FrameworkBundle / Autowiring framework:โ€จ http_client:โ€จ max_host_connections: 4โ€จ default_options:โ€จ # ...โ€จ scoped_clients:โ€จ github_client:โ€จ base_uri: https://api.github.comโ€จ headers:โ€จ Authorization: token abc123โ€จ # creates the HttpClientInterface $githubClient autowiring alias # and the HttpClientInterface $scopingHttpClient oneโ€จ
  • 32. by @nicolasgrekas & @andrerom Usage with WebProfilerBundle
  • 33. by @nicolasgrekas & @andrerom Usage with BrowserKitHttpBrowser use SymfonyComponentBrowserKitHttpBrowser;โ€จ use SymfonyComponentHttpClientHttpClient;โ€จ โ€จ $client = HttpClient::create();โ€จ $browser = new HttpBrowser($client);โ€จ โ€จ $browser->request('GET', 'https://example.com/');โ€จ $browser->clickLink('Log In');โ€จ $browser->submitForm('Sign In', ['username' => 'me', 'password' => 'pass']);โ€จ $browser->clickLink('Subscriptions')โ€จ ->filter('table tr:nth-child(2) td:nth-child(2)')โ€จ ->each(function ($node) { echo trim($node->text())."n"; });
  • 34. by @nicolasgrekas & @andrerom R.I.P. Goutte HttpClient + DomCrawler + CssSelector + HttpKernel + BrowserKit
  • 35. Symfony Mime Componentโ€จ Everything you need to create beautiful emails
  • 36. use SymfonyComponentMimeEmail; $email = (new Email()) ->from('fabien@symfony.com') ->to('fabien@sensiolabs.com') ->subject('Some subject') ->text('Some text message') ->html('<b>Some HTML message</b>') ->attach('doc.txt') ; The basics
  • 37. Why is it so differentโ€จ from Swiftmailer?
  • 38. $email = (new Email()) ->text('Some text message') ->html('<b>Some HTML message</b>') ; $email = (new Swift_Message()) ->setBody('Some text message') ->addPart('<b>Some HTML message</b>', 'text/html') ; A better data object model 16k serialized 38 objects complex serialization "fixed" headers 2k serialized 7 objects simple serialization "dynamic" headers
  • 39. echo $email->toString(); sleep(2); $email->to('helene@symfony.com'); echo $email->toString(); Fixed vs dynamic headers Differentโ€จ set of headers Date,Boundary,Message-ID
  • 40. $email = (new Email()) ->from('fabien@symfony.com') ->to('fabien@sensiolabs.com') ->subject('Some subject') ->text(fopen('email.txt', 'r')) ->html(fopen('email.html', 'r')) ; echo $email->toString(); foreach ($email->toIterable() as $chunk) { echo $chunk; } String or resources,your choice
  • 41. $email ->attach('Some content', 'doc.txt', 'text/plain') ->attachFromPath('/path/to/doc.txt') ->attach(fopen('doc.txt', 'r'), 'doc.txt', 'text/plain') ; Attachments
  • 42. $email = (new Email()) ->from('fabien@symfony.com') ->to('fabien@sensiolabs.com') ->subject('Some subject') ->text('Some text') ->html('<b>The new logo: <img src="cid:logo.jpg"></b>') ->embedFromPath('logo-small.jpg', 'logo.jpg') ; Embeds
  • 43. use SymfonyBridgeTwigMimeBodyRenderer; use SymfonyBridgeTwigMimeTemplatedEmail; use TwigEnvironment; use TwigLoaderFilesystemLoader; use SymfonyComponentMimeNamedAddress; $twig = new Environment($loader = new FilesystemLoader(__DIR__.'/templates')); $loader->addPath(__DIR__.'/images', 'images'); $email = (new TemplatedEmail()) ->from('fabien@symfony.com') ->to(new NamedAddress('fabien@sensiolabs.com', 'Fabien')) ->text('Some text content') ->htmlTemplate('simple.html.twig') ->context([ 'city' => 'Lille' ]) ; $renderer = new BodyRenderer($twig); $renderer->render($email); echo $email->toString(); Native integration with Twig
  • 44. <p> Welcome <b>{{ email.toName }}</b> from {{ city }}! </p> <p> <img src="{{ email.image('@images/photo.jpg') }}"> </p> Native integration with Twig SymfonyBridgeTwigMime WrappedTemplatedEmail Twig template name Template context
  • 45. {% do email.attach('@docs/doc.pdf') %} <p> Welcome <b>{{ email.toName }}</b>! </p> <p> <img src="{{ email.image('@images/photo.jpg') }}"> </p> Native integration with Twig
  • 46. {% do email.priority(5) %} <p> Welcome <b>{{ email.toName }}</b>! </p> <p> <img src="{{ email.image('@images/photo.jpg') }}"> </p> Native integration with Twig
  • 47. $email = (new TemplatedEmail()) ->from('fabien@symfony.com') ->to(new NamedAddress('fabien@sensiolabs.com', 'Fabien')) ->textTemplate('simple.txt.twig') ->htmlTemplate('simple.html.twig') ; Native integration with Twig
  • 48. Tip! If the Text part is empty, the BodyRenderer automatically generates one
  • 49. use TwigCssInlinerCssInlinerExtension; $twig->addExtension(new CssInlinerExtension()); {% apply inline_css %} <style> b { color: red } </style> <p> Welcome <b>{{ email.toName }}</b>! </p> {% endapply %} Inlining CSS
  • 50. {% apply inline_css("@css/email.css") %} <style> b { color: red } </style> <p> Welcome <b>{{ email.toName }}</b>! </p> {% endapply %} Inlining CSS
  • 51. use TwigMarkdownMarkdownExtension; $twig->addExtension(new MarkdownExtension()); <p> {% apply markdown %} | Version | LTS? | Latest | | ------------- |:-------------:| -------:| | 1.0 | Yes | 1.0.1 | | 2.1 | No | 2.1.33 | {% endapply %} </p> Use Markdown to simplify your templates
  • 52. use TwigInkyInkyExtension; $twig->addExtension(new InkyExtension()); Use Inky to simplify your HTML https://foundation.zurb.com/emails.html
  • 53. {% apply inky|inline_css(source("@zurb/stylesheets/main.css")) %} <container> <row class="header"> <columns> <spacer size="16"></spacer> <h4 class="text-center">Symfony Connect</h4> </columns> </row> <row> <columns> <spacer size="32"></spacer> <center><img width="100px" src="{{ email.image("@images/symfony.png") }}"></center> <spacer size="16"></spacer> <h1 class="text-center">Forgot Your Password?</h1> <spacer size="16"></spacer> <p class="text-center">It happens. Click the link below to reset it.</p> <button class="large expand" href="#">Reset Password</button> <hr/> <p><small><center><a href="#">unsubscribe here</a>.</small></center></p> </columns> </row> </container> {% endapply %} Use Inky to simplify your HTML
  • 55. use SymfonyComponentMailerTransportSmtpSmtpTransport;โ€จ โ€จ $transport = new SmtpTransport('localhost'); $transport->send($email); The basics Email is sent for everybody or not at all
  • 56. use SymfonyComponentMailerBridgeAmazoneSmtpSesTransport; use SymfonyComponentMailerBridgeGoogleSmtpGmailTransport; use SymfonyComponentMailerBridgeMailchimpSmtpMandrillTransport; use SymfonyComponentMailerBridgeMailgunSmtpMailgunTransport; use SymfonyComponentMailerBridgePostmarkSmtpPostmarkTransport; use SymfonyComponentMailerBridgeSendgridSmtpSendgridTransport; new SesTransport('user', 'pass', 'eu-west-1'); new GmailTransport('user', 'pass'); new MandrillTransport('user', 'pass'); new MailgunTransport('user', 'pass'); new PostmarkTransport(โ€˜key'); new SendgridTransport('key'); SMTP: Shortcuts
  • 57. use SymfonyComponentMailerBridgeMailgunHttpMailgunTransport; new MailgunTransport(โ€˜keyโ€™, โ€˜domain'); โ€ฆ also for Amazone SES & Mandrill HTTP: Raw message
  • 58. use SymfonyComponentMailerBridgeMailgunHttpApiMailgunTransport; use SymfonyComponentMailerBridgePostmarkHttpApiPostmarkTransport; new MailgunTransport(โ€˜key', โ€˜domain'); new PostmarkTransport(โ€˜keyโ€™); โ€ฆ also for Amazone SES, Mandrill & Sendgrid HTTP: Via API
  • 59. SMTP / HTTP / API? SMTP HTTP API Offline Yes via Mailcatcher No / Mock No / Mock Mailcatcher Yes No No Standard Yes No No Symfony generated Yes Yes No Fast No Yes Yes
  • 62. public function email(TransportInterface $transport) { $email = (new Email())->โ€ฆ; $transport->send($email); return new Response('Sent'); } Sending emails
  • 64. // Under the hood this is done when async $transport = Transport::fromDsn('smtp://localhost')); $transport->send($email); โ€จ $bus->dispatch($email); Messages via Messenger
  • 65. Emails are sent async via AMQP framework: messenger: routing: 'SymfonyComponentMailerEnvelopedMessage': amqp Emails are sent immediately framework: messenger: routing: #'SymfonyComponentMailerEnvelopedMessage': amqp Sync or Async,your choice
  • 66. Leveragesโ€จ the Symfony ecosystem Twig Encore Serializer Messenger PSR logger CSS selector Event Dispatcher Dependency Injection Container Symfony Polyfills (punycode, intl, โ€ฆ) โ€ฆ with all the great features you love in Swiftmailer 6 Symfony Mailer