SlideShare une entreprise Scribd logo
1  sur  127
Télécharger pour lire hors ligne
FORGET ABOUT INDEX.PHP
BUILD YOUR APPLICATIONS AROUND HTTP!
Kacper Gunia @cakper
Software Engineer @SensioLabsUK
Symfony Certified Developer
PHPers Silesia @PHPersPL
Good old days
flickr.com/linkahwai/5162310920
Hello world in PHP“ ” + tutorial
Gojko’s two facts about
programming web:
1)Ctrl-C
2)Ctrl-V
<?php	
  
$name	
  =	
  $_GET['name'];	
  
echo	
  "Hello	
  $name!";
It works! :D
but…
How HTTP works?
flickr.com/see-­‐through-­‐the-­‐eye-­‐of-­‐g/4278744230
Request
Kamehameha!
Response
This is what HTTP is about!
Request
Response
This is what Your App is about!
Request
Response
“(…) the goal of your
application is always to
interpret a request and
create the appropriate
response based on your
application logic.”
Symfony.com
HTTP is simple
flickr.com/wildhaber/5936335464
Request
flickr.com/haniamir/3318727924
GET	
  /index.php?name=Kacper	
  HTTP/1.1	
  
Host:	
  localhost
GET	
  /index.php?name=Kacper	
  HTTP/1.1	
  
Host:	
  localhost
I want to see…
GET	
  /index.php?name=Kacper	
  HTTP/1.1	
  
Host:	
  localhost
…this resource!
GET	
  /index.php?name=Kacper	
  HTTP/1.1	
  
Host:	
  localhost
And I know it should be on localhost
GET	
  /index.php?name=Kacper	
  HTTP/1.1	
  
Host:	
  localhost
Psst, I’m using 1.1 version of HTTP protocol
Response
flickr.com/aftab/3364835006
HTTP/1.1	
  200	
  OK	
  
Content-­‐type:	
  text/html	
  
Hello	
  Kacper!
HTTP/1.1	
  200	
  OK	
  
Content-­‐type:	
  text/html	
  
Hello	
  Kacper!
OK man, I’ve found it!
HTTP/1.1	
  200	
  OK	
  
Content-­‐type:	
  text/html	
  
Hello	
  Kacper!
And it’s an HTML
HTTP/1.1	
  200	
  OK	
  
Content-­‐type:	
  text/html	
  
Hello	
  Kacper!
Hello World!
[METH]	
  [REQUEST-­‐URI]	
  HTTP/[VER]	
  
[Field1]:	
  [Value1]	
  
[Field2]:	
  [Value2]	
  
[request	
  body,	
  if	
  any]
HTTP/[VER]	
  [CODE]	
  [TEXT]	
  
[Field1]:	
  [Value1]	
  
[Field2]:	
  [Value2]	
  
[response	
  body]
ResponseRequest
What if we create objects
from Request & Response?
Object-oriented HTTP
flickr.com/mohammadafshar/9571051345
GET	
  /index.php?name=Kacper	
  HTTP/1.1	
  
Host:	
  localhost
$request-­‐>getMethod();	
  	
  	
  GET	
  
$request-­‐>getPathInfo();	
  /
HTTP/1.1	
  200	
  OK	
  
Content-­‐type:	
  text/html	
  
Hello	
  Kacper!
$response-­‐>getStatusCode();	
  200	
  
$response-­‐>getContent();	
  	
  	
  	
  Hello	
  Kacper!
HttpFoundation
flickr.com/rubempjr/8050505443
“The HttpFoundation
component defines
an object-oriented

layer for the HTTP
specification”
Symfony.com
Request
flickr.com/haniamir/3318727924
$request	
  =	
  Request::createFromGlobals();	
  
$request	
  =	
  new	
  Request(	
  
	
  	
  	
  	
  $_GET,	
  
	
  	
  	
  	
  $_POST,	
  
	
  	
  	
  	
  array(),	
  
	
  	
  	
  	
  $_COOKIE,	
  
	
  	
  	
  	
  $_FILES,	
  
	
  	
  	
  	
  $_SERVER	
  
);
 	
  	
  	
  $_GET	
  	
  	
  	
  	
  $request-­‐>query	
  	
  
	
  	
  	
  	
  $_POST	
  	
  	
  	
  $request-­‐>request	
  
	
  	
  	
  	
  $_COOKIE	
  	
  $request-­‐>cookies	
  
	
  	
  	
  	
  $_FILES	
  	
  	
  $request-­‐>files	
  
	
  	
  	
  	
  $_SERVER	
  	
  $request-­‐>server	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $request-­‐>headers	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $request-­‐>attributes
ParameterBag instances
$name	
  =	
  isset($_GET['name'])	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  ?	
  $_GET['name']	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  :	
  "World";
$name	
  =	
  $request	
  
	
  	
  	
  	
  	
  	
  	
  	
  -­‐>query	
  
	
  	
  	
  	
  	
  	
  	
  	
  -­‐>get('name',	
  'World');
$request-­‐>isSecure();
Verify configured secure header or the standard one
$request-­‐>isXmlHttpRequest();
Verify AJAX request
$request	
  =	
  Request::create(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  '/',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'GET',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ['name'	
  =>	
  'Kacper']	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );
Simulate a Request
Response
flickr.com/aftab/3364835006
$response	
  =	
  new	
  Response(	
  
	
  	
  	
  	
  ‘Hello	
  Kacper!’,	
  
	
  	
  	
  	
  Response::HTTP_OK,	
  
	
  	
  	
  	
  ['content-­‐type'	
  =>	
  'text/html']	
  
);	
  
$response-­‐>prepare($request);	
  
$response-­‐>send();
$response	
  =	
  new	
  RedirectResponse(

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'http://example.com/'	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );
Redirect Response
$response	
  =	
  new	
  JsonResponse();	
  
$response-­‐>setData(['name'	
  =>	
  'Kacper']);
JSON Response
Let’s use them
together!
$kernel	
  =	
  new	
  AppKernel('dev',	
  true);	
  
$request	
  =	
  Request::createFromGlobals();	
  
$response	
  =	
  $kernel-­‐>handle($request);	
  
$response-­‐>send();	
  
$kernel-­‐>terminate($request,	
  $response);
Symfony app_dev.php
$kernel	
  =	
  new	
  AppKernel('dev',	
  true);	
  
$request	
  =	
  Request::createFromGlobals();	
  
$response	
  =	
  $kernel-­‐>handle($request);	
  
$response-­‐>send();	
  
$kernel-­‐>terminate($request,	
  $response);
Symfony app_dev.php
Reminds something? ;)
Request
Kamehameha!
Response
Front Controller
flickr.com/cedwardbrice/8334047708
”The Front Controller
consolidates all request
handling by channeling
requests through a single
handler object (…)”
MartinFowler.com
$kernel	
  =	
  new	
  AppKernel('dev',	
  true);	
  
$request	
  =	
  Request::createFromGlobals();	
  
$response	
  =	
  $kernel-­‐>handle($request);	
  
$response-­‐>send();	
  
$kernel-­‐>terminate($request,	
  $response);
Let’s go deeper…
HTTP Kernel
flickr.com/stuckincustoms/6341844005
“The HttpKernel
component provides a
structured process for
converting a Request into
a Response by making use
of the EventDispatcher.”
Symfony.com
interface	
  HttpKernelInterface	
  
{	
  
	
  	
  	
  	
  const	
  MASTER_REQUEST	
  =	
  1;	
  
	
  	
  	
  	
  const	
  SUB_REQUEST	
  =	
  2;	
  
	
  	
  	
  	
  /**	
  
	
  	
  	
  	
  	
  *	
  @return	
  Response	
  A	
  Response	
  instance	
  
	
  	
  	
  	
  	
  */	
  
	
  	
  	
  	
  public	
  function	
  handle(	
  
	
  	
  	
  	
  	
  	
  	
  	
  Request	
  $request,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  $type	
  =	
  self::MASTER_REQUEST,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  $catch	
  =	
  true);	
  
}
How Symfony transforms
Request into Response?
Event Dispatcher
flickr.com/parksjd/11847079564
“The EventDispatcher
component provides tools
that allow your application
components to communicate
with each other by
dispatching events and
listening to them.”
Symfony.com
EventDispatcher is an
implementation of
Mediator pattern
$dispatcher	
  =	
  new	
  EventDispatcher();	
  
$dispatcher-­‐>addListener(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'foo.action',	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  function	
  (Event	
  $event)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  do	
  whatever	
  you	
  need	
  
});	
  
$event	
  =	
  new	
  Event();	
  
$dispatcher-­‐>dispatch('foo.action',	
  $event);
The kernel.request Event
flickr.com/drakegoodman/13479419575
Manipulate your
Request here…
…you can even
return a Response!
public	
  function	
  onKernelRequest(GetResponseEvent	
  $event)	
  
{	
  
	
  	
  	
  	
  $request	
  =	
  $event-­‐>getRequest();	
  
	
  	
  	
  	
  if	
  ($request-­‐>query-­‐>get('name')	
  ===	
  'Kacper')	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $event-­‐>setResponse(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  new	
  Response("We	
  don't	
  like	
  you!")	
  
	
  	
  	
  	
  	
  	
  	
  	
  );	
  
	
  	
  	
  	
  }	
  
}
…or e.g. detect
device, location…
…and routing is
resolved here
The Routing Component
flickr.com/checksam/12814058644
“The Routing
component maps an
HTTP request to a set
of configuration
variables.”
Symfony.com
$route	
  =	
  new	
  Route('/',	
  array('controller'	
  =>	
  'HelloController'));	
  
$routes	
  =	
  new	
  RouteCollection();	
  
$routes-­‐>add('hello_route',	
  $route);	
  
$context	
  =	
  new	
  RequestContext();	
  
$context-­‐>fromRequest($request);	
  
$matcher	
  =	
  new	
  UrlMatcher($routes,	
  $context);	
  
$parameters	
  =	
  $matcher-­‐>match('/');	
  
//	
  ['controller'	
  =>	
  'HelloController',	
  '_route'	
  =>	
  'hello_route']
$route	
  =	
  new	
  Route('/',	
  array('controller'	
  =>	
  'HelloController'));	
  
$routes	
  =	
  new	
  RouteCollection();	
  
$routes-­‐>add('hello_route',	
  $route);	
  
$context	
  =	
  new	
  RequestContext();	
  
$context-­‐>fromRequest($request);	
  
$matcher	
  =	
  new	
  UrlMatcher($routes,	
  $context);	
  
$parameters	
  =	
  $matcher-­‐>match('/');	
  
//	
  ['controller'	
  =>	
  'HelloController',	
  '_route'	
  =>	
  'hello_route']
$route	
  =	
  new	
  Route('/',	
  array('controller'	
  =>	
  'HelloController'));	
  
$routes	
  =	
  new	
  RouteCollection();	
  
$routes-­‐>add('hello_route',	
  $route);	
  
$context	
  =	
  new	
  RequestContext();	
  
$context-­‐>fromRequest($request);	
  
$matcher	
  =	
  new	
  UrlMatcher($routes,	
  $context);	
  
$parameters	
  =	
  $matcher-­‐>match('/');	
  
//	
  ['controller'	
  =>	
  'HelloController',	
  '_route'	
  =>	
  'hello_route']
$route	
  =	
  new	
  Route('/',	
  array('controller'	
  =>	
  'HelloController'));	
  
$routes	
  =	
  new	
  RouteCollection();	
  
$routes-­‐>add('hello_route',	
  $route);	
  
$context	
  =	
  new	
  RequestContext();	
  
$context-­‐>fromRequest($request);	
  
$matcher	
  =	
  new	
  UrlMatcher($routes,	
  $context);	
  
$parameters	
  =	
  $matcher-­‐>match('/');	
  
//	
  ['controller'	
  =>	
  'HelloController',	
  '_route'	
  =>	
  'hello_route']
$route	
  =	
  new	
  Route('/',	
  array('controller'	
  =>	
  'HelloController'));	
  
$routes	
  =	
  new	
  RouteCollection();	
  
$routes-­‐>add('hello_route',	
  $route);	
  
$context	
  =	
  new	
  RequestContext();	
  
$context-­‐>fromRequest($request);	
  
$matcher	
  =	
  new	
  UrlMatcher($routes,	
  $context);	
  
$parameters	
  =	
  $matcher-­‐>match('/');	
  
//	
  ['controller'	
  =>	
  'HelloController',	
  '_route'	
  =>	
  'hello_route']
Resolve Controller
flickr.com/rightbrainphotography/480979176
interface	
  ControllerResolverInterface	
  
{	
  
	
  	
  	
  	
  public	
  function	
  getController(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Request	
  $request	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );	
  
	
  	
  	
  	
  public	
  function	
  getArguments(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Request	
  $request,	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $controller	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );	
  
}
Controller is
a PHP callable
The kernel.controller Event
flickr.com/drakegoodman/12451824524
Change controller
here (if you need)
and initialise data
e.g. parameters
conversion
happens now
Resolve Arguments
flickr.com/joiseyshowaa/2720195951
interface	
  ControllerResolverInterface	
  
{	
  
	
  	
  	
  	
  public	
  function	
  getController(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Request	
  $request	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );	
  
	
  	
  	
  	
  public	
  function	
  getArguments(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Request	
  $request,	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $controller	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );	
  
}
Arguments come from
$request->attributes
ParameterBag
Controller Call
flickr.com/taspicsvns/11768808836
Time for your
application logic
Return
Response object
Optional:
The kernel.view event
flickr.com/drakegoodman/11006558364
Transform
non-Response
into Response
e.g.
@Template
annotation
e.g. transform
arrays into
JSON Responses
The kernel.response Event
flickr.com/drakegoodman/14482752231
Manipulate
Response
e.g.
WebDebugToolbar
Send Response
flickr.com/stuckincustoms/5727003126
The kernel.terminate Event
flickr.com/drakegoodman/12203395206
Do the heavy
stuff now
e.g.
Send Emails
HTTP Cache
flickr.com/soldiersmediacenter/403524071
Cache-Control
Expires
Cache-Control
Expires
$response	
  =	
  new	
  Response();	
  
$response-­‐>setPublic();	
  
$response-­‐>setMaxAge(600);	
  
$response-­‐>setSharedMaxAge(600);
Validation
public	
  function	
  indexAction(Request	
  $request,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $name)	
  
{	
  
	
  	
  	
  	
  $response	
  =	
  new	
  Response("Hello	
  $name");	
  
	
  	
  	
  	
  $response-­‐>setETag(md5($response-­‐>getContent()));	
  
	
  	
  	
  	
  $response-­‐>setPublic();	
  
	
  	
  	
  	
  $response-­‐>isNotModified($request);	
  
	
  	
  	
  	
  return	
  $response;	
  
}
ESI
flickr.com/nasamarshall/6950477589
“The ESI specification
describes tags you can
embed in your pages
to communicate with
the gateway cache.”
Symfony.com
<!DOCTYPE	
  html>	
  
<html>	
  
	
  	
  	
  	
  <body>	
  
	
  	
  	
  	
  <!-­‐-­‐	
  ...	
  content	
  -­‐-­‐>	
  
	
  	
  	
  	
  <!-­‐-­‐	
  Embed	
  the	
  content	
  of	
  another	
  page	
  -­‐-­‐>	
  
	
  	
  	
  	
  <esi:include	
  src="http://..."/>	
  
	
  	
  	
  	
  <!-­‐-­‐	
  ...	
  content	
  -­‐-­‐>	
  
	
  	
  	
  	
  </body>	
  
</html>
But I don’t have
Varnish!
Symfony2 Reverse Proxy
flickr.com/zacharyz/3950845049
$kernel	
  =	
  new	
  AppKernel('prod',	
  false);	
  
$kernel-­‐>loadClassCache();	
  
$kernel	
  =	
  new	
  AppCache($kernel);	
  
$request	
  =	
  Request::createFromGlobals();	
  
$response	
  =	
  $kernel-­‐>handle($request);	
  
$response-­‐>send();	
  
$kernel-­‐>terminate($request,	
  $response);
$kernel	
  =	
  new	
  AppKernel('prod',	
  false);	
  
$kernel-­‐>loadClassCache();	
  
$kernel	
  =	
  new	
  AppCache($kernel);	
  
$request	
  =	
  Request::createFromGlobals();	
  
$response	
  =	
  $kernel-­‐>handle($request);	
  
$response-­‐>send();	
  
$kernel-­‐>terminate($request,	
  $response);
OK, but are those things
actually used outside
of Symfony?
YES!
Drupal 8
phpBB
SilexeZ Publish
Laravel
Kacper Gunia
Software Engineer
Symfony Certified Developer
PHPers Silesia
Thanks!

Contenu connexe

Tendances

Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationKirill Chebunin
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteLeonardo Proietti
 
Dependency Injection in PHP
Dependency Injection in PHPDependency Injection in PHP
Dependency Injection in PHPKacper Gunia
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needKacper Gunia
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony TechniquesKris Wallsmith
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICKonstantin Kudryashov
 
Symfony without the framework
Symfony without the frameworkSymfony without the framework
Symfony without the frameworkGOG.com dev team
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Konstantin Kudryashov
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP GeneratorsMark Baker
 
Symfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendSymfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendKirill Chebunin
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2Hugo Hamon
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 
Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)Kris Wallsmith
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful softwareJorn Oomen
 

Tendances (20)

PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 Application
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
 
Dependency Injection in PHP
Dependency Injection in PHPDependency Injection in PHP
Dependency Injection in PHP
 
Zero to SOLID
Zero to SOLIDZero to SOLID
Zero to SOLID
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
Mocking Demystified
Mocking DemystifiedMocking Demystified
Mocking Demystified
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
New in php 7
New in php 7New in php 7
New in php 7
 
Symfony without the framework
Symfony without the frameworkSymfony without the framework
Symfony without the framework
 
Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP Generators
 
Symfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friendSymfony2 Service Container: Inject me, my friend
Symfony2 Service Container: Inject me, my friend
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 
Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010
 
Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
 

Similaire à Forget about Index.php and build you applications around HTTP - PHPers Cracow

Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Jakub Zalas
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsMichael Peacock
 
Symfony internals [english]
Symfony internals [english]Symfony internals [english]
Symfony internals [english]Raul Fraile
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2eugenio pombi
 
The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)Fabien Potencier
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207patter
 
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyoエラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyoShohei Okada
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012D
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014Amazon Web Services
 
Dirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionDirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionAdam Trachtenberg
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Elena Kolevska
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframeworkRadek Benkel
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 

Similaire à Forget about Index.php and build you applications around HTTP - PHPers Cracow (20)

Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
 
Symfony internals [english]
Symfony internals [english]Symfony internals [english]
Symfony internals [english]
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
 
The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)The symfony platform: Create your very own framework (PHP Quebec 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207
 
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyoエラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
(DEV305) Building Apps with the AWS SDK for PHP | AWS re:Invent 2014
 
Dirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionDirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP Extension
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Perl Web Client
Perl Web ClientPerl Web Client
Perl Web Client
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
 
Fatc
FatcFatc
Fatc
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframework
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 

Plus de Kacper Gunia

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemKacper Gunia
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedKacper Gunia
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingKacper Gunia
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD dieKacper Gunia
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Kacper Gunia
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolKacper Gunia
 

Plus de Kacper Gunia (8)

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty system
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doing
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD die
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ tool
 
Code Dojo
Code DojoCode Dojo
Code Dojo
 
SpecBDD in PHP
SpecBDD in PHPSpecBDD in PHP
SpecBDD in PHP
 

Dernier

Solving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.pptSolving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.pptJasonTagapanGulla
 
US Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of ActionUS Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of ActionMebane Rash
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catcherssdickerson1
 
Input Output Management in Operating System
Input Output Management in Operating SystemInput Output Management in Operating System
Input Output Management in Operating SystemRashmi Bhat
 
Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...VICTOR MAESTRE RAMIREZ
 
Mine Environment II Lab_MI10448MI__________.pptx
Mine Environment II Lab_MI10448MI__________.pptxMine Environment II Lab_MI10448MI__________.pptx
Mine Environment II Lab_MI10448MI__________.pptxRomil Mishra
 
Steel Structures - Building technology.pptx
Steel Structures - Building technology.pptxSteel Structures - Building technology.pptx
Steel Structures - Building technology.pptxNikhil Raut
 
welding defects observed during the welding
welding defects observed during the weldingwelding defects observed during the welding
welding defects observed during the weldingMuhammadUzairLiaqat
 
Introduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxIntroduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxk795866
 
System Simulation and Modelling with types and Event Scheduling
System Simulation and Modelling with types and Event SchedulingSystem Simulation and Modelling with types and Event Scheduling
System Simulation and Modelling with types and Event SchedulingBootNeck1
 
Internet of things -Arshdeep Bahga .pptx
Internet of things -Arshdeep Bahga .pptxInternet of things -Arshdeep Bahga .pptx
Internet of things -Arshdeep Bahga .pptxVelmuruganTECE
 
An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...Chandu841456
 
NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...
NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...
NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...Amil Baba Dawood bangali
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...asadnawaz62
 
Transport layer issues and challenges - Guide
Transport layer issues and challenges - GuideTransport layer issues and challenges - Guide
Transport layer issues and challenges - GuideGOPINATHS437943
 
Correctly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleCorrectly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleAlluxio, Inc.
 
Virtual memory management in Operating System
Virtual memory management in Operating SystemVirtual memory management in Operating System
Virtual memory management in Operating SystemRashmi Bhat
 

Dernier (20)

🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...
🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...
🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...
 
Solving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.pptSolving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.ppt
 
US Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of ActionUS Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of Action
 
Design and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdfDesign and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdf
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
 
Input Output Management in Operating System
Input Output Management in Operating SystemInput Output Management in Operating System
Input Output Management in Operating System
 
Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...
 
Mine Environment II Lab_MI10448MI__________.pptx
Mine Environment II Lab_MI10448MI__________.pptxMine Environment II Lab_MI10448MI__________.pptx
Mine Environment II Lab_MI10448MI__________.pptx
 
Steel Structures - Building technology.pptx
Steel Structures - Building technology.pptxSteel Structures - Building technology.pptx
Steel Structures - Building technology.pptx
 
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Serviceyoung call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
 
welding defects observed during the welding
welding defects observed during the weldingwelding defects observed during the welding
welding defects observed during the welding
 
Introduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxIntroduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptx
 
System Simulation and Modelling with types and Event Scheduling
System Simulation and Modelling with types and Event SchedulingSystem Simulation and Modelling with types and Event Scheduling
System Simulation and Modelling with types and Event Scheduling
 
Internet of things -Arshdeep Bahga .pptx
Internet of things -Arshdeep Bahga .pptxInternet of things -Arshdeep Bahga .pptx
Internet of things -Arshdeep Bahga .pptx
 
An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...An experimental study in using natural admixture as an alternative for chemic...
An experimental study in using natural admixture as an alternative for chemic...
 
NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...
NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...
NO1 Certified Black Magic Specialist Expert Amil baba in Uae Dubai Abu Dhabi ...
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...
 
Transport layer issues and challenges - Guide
Transport layer issues and challenges - GuideTransport layer issues and challenges - Guide
Transport layer issues and challenges - Guide
 
Correctly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleCorrectly Loading Incremental Data at Scale
Correctly Loading Incremental Data at Scale
 
Virtual memory management in Operating System
Virtual memory management in Operating SystemVirtual memory management in Operating System
Virtual memory management in Operating System
 

Forget about Index.php and build you applications around HTTP - PHPers Cracow