SlideShare a Scribd company logo
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!";
Forget about Index.php and build you applications around HTTP - PHPers Cracow
It works! :D
but…
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers Cracow
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?
Forget about Index.php and build you applications around HTTP - PHPers Cracow
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
Forget about Index.php and build you applications around HTTP - PHPers Cracow
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!")	
  
	
  	
  	
  	
  	
  	
  	
  	
  );	
  
	
  	
  	
  	
  }	
  
}
Forget about Index.php and build you applications around HTTP - PHPers Cracow
…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
Forget about Index.php and build you applications around HTTP - PHPers Cracow
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
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Change controller
here (if you need)
and initialise data
e.g. parameters
conversion
happens now
Resolve Arguments
flickr.com/joiseyshowaa/2720195951
Forget about Index.php and build you applications around HTTP - PHPers Cracow
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
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Time for your
application logic
Return
Response object
Optional:
The kernel.view event
flickr.com/drakegoodman/11006558364
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Transform
non-Response
into Response
e.g.
@Template
annotation
e.g. transform
arrays into
JSON Responses
The kernel.response Event
flickr.com/drakegoodman/14482752231
Forget about Index.php and build you applications around HTTP - PHPers Cracow
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!

More Related Content

PDF
November Camp - Spec BDD with PHPSpec 2
PDF
PHPSpec - the only Design Tool you need - 4Developers
PDF
The IoC Hydra - Dutch PHP Conference 2016
PDF
Forget about index.php and build you applications around HTTP!
PDF
PhpSpec 2.0 ilustrated by examples
PDF
The IoC Hydra
PDF
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
ODP
Rich domain model with symfony 2.5 and doctrine 2.5
November Camp - Spec BDD with PHPSpec 2
PHPSpec - the only Design Tool you need - 4Developers
The IoC Hydra - Dutch PHP Conference 2016
Forget about index.php and build you applications around HTTP!
PhpSpec 2.0 ilustrated by examples
The IoC Hydra
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Rich domain model with symfony 2.5 and doctrine 2.5

What's hot (20)

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

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

PDF
Symfony internals [english]
PDF
Symfony components in the wild, PHPNW12
PDF
Silex Cheat Sheet
PDF
Silex Cheat Sheet
PDF
Symfony 2 (PHP Quebec 2009)
PDF
Symfony2 - Request to Response
PDF
Developing cacheable PHP applications - Confoo 2018
PPTX
Creating your own framework on top of Symfony2 Components
PDF
Developing cacheable PHP applications - PHPLimburgBE 2018
PDF
Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018
PDF
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
PDF
Web services tutorial
PDF
Symfony 2 (PHP day 2009)
PPTX
Day02 a pi.
PDF
Web Services Tutorial
KEY
Phpne august-2012-symfony-components-friends
PPT
nguyenhainhathuy-building-restful-web-service
PDF
Building custom APIs
PDF
Build powerfull and smart web applications with Symfony2
PDF
Symfony book 2.1
Symfony internals [english]
Symfony components in the wild, PHPNW12
Silex Cheat Sheet
Silex Cheat Sheet
Symfony 2 (PHP Quebec 2009)
Symfony2 - Request to Response
Developing cacheable PHP applications - Confoo 2018
Creating your own framework on top of Symfony2 Components
Developing cacheable PHP applications - PHPLimburgBE 2018
Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
Web services tutorial
Symfony 2 (PHP day 2009)
Day02 a pi.
Web Services Tutorial
Phpne august-2012-symfony-components-friends
nguyenhainhathuy-building-restful-web-service
Building custom APIs
Build powerfull and smart web applications with Symfony2
Symfony book 2.1
Ad

More from Kacper Gunia (8)

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

Recently uploaded (20)

PPTX
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
PPTX
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
PPTX
Lecture Notes Electrical Wiring System Components
PPTX
Geodesy 1.pptx...............................................
PDF
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PPT
Mechanical Engineering MATERIALS Selection
PPTX
additive manufacturing of ss316l using mig welding
PDF
PPT on Performance Review to get promotions
PPTX
CYBER-CRIMES AND SECURITY A guide to understanding
PPTX
CH1 Production IntroductoryConcepts.pptx
PDF
Well-logging-methods_new................
PPTX
Internet of Things (IOT) - A guide to understanding
PPTX
Foundation to blockchain - A guide to Blockchain Tech
PPTX
bas. eng. economics group 4 presentation 1.pptx
PPTX
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
PPT
Project quality management in manufacturing
PDF
Structs to JSON How Go Powers REST APIs.pdf
PPTX
OOP with Java - Java Introduction (Basics)
DOCX
573137875-Attendance-Management-System-original
PPTX
Sustainable Sites - Green Building Construction
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
Lecture Notes Electrical Wiring System Components
Geodesy 1.pptx...............................................
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
Mechanical Engineering MATERIALS Selection
additive manufacturing of ss316l using mig welding
PPT on Performance Review to get promotions
CYBER-CRIMES AND SECURITY A guide to understanding
CH1 Production IntroductoryConcepts.pptx
Well-logging-methods_new................
Internet of Things (IOT) - A guide to understanding
Foundation to blockchain - A guide to Blockchain Tech
bas. eng. economics group 4 presentation 1.pptx
Engineering Ethics, Safety and Environment [Autosaved] (1).pptx
Project quality management in manufacturing
Structs to JSON How Go Powers REST APIs.pdf
OOP with Java - Java Introduction (Basics)
573137875-Attendance-Management-System-original
Sustainable Sites - Green Building Construction

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