Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Micropage in microtime using microframework

Micropage in microtime using microframework

Why you don't always need full stack framework? Examples based on PHP's Slim Framework.

3a453374a79becf33b3a6659389a56c4?s=128

Radek Benkel

January 23, 2012
Tweet

More Decks by Radek Benkel

Other Decks in Technology

Transcript

  1. 1

  2. 2

  3. 3 PAGE

  4. 4 PAGE TIME

  5. 5 PAGE TIME FRAMEWORK

  6. 6 name: Radosław Benkel nick: singles www: http://www.rbenkel.me twitter: @singlespl

    * * and I have nothing in common with http://www.singles.pl ;]
  7. SOMETIMES, FULL STACK FRAMEWORK IS AN OVERHEAD 7

  8. THIS IS WHY WE HAVE MICROFRAMEWORKS 8

  9. 9

  10. 10 ➜

  11. USUALLY, DOES SMALL AMOUT OF THINGS. 11

  12. USUALLY, DOES SMALL AMOUT OF THINGS. 12 ROUTING

  13. USUALLY, DOES SMALL AMOUT OF THINGS. 13 ROUTING HTTP CACHING

  14. USUALLY, DOES SMALL AMOUT OF THINGS. 14 ROUTING TEMPLATES HTTP

    CACHING
  15. 15

  16. I

  17. 17

  18. 18

  19. "OK,

  20. Little

  21. I'LL USE 21 http://www.slimframework.com/

  22. BUT THERE ARE OTHERS: 22 http://flightphp.com/ http://www.limonade-php.net http://silex.sensiolabs.org/

  23. SLIM EXAMPLES 23

  24. 24 <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/', function()

    { echo 'Hello World from base route.'; }); $app->run(); BASE ROUTING
  25. 25 <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/', function()

    { echo 'Hello World from base route.'; }); //param "name" is required $app->get('/hello_to/:name', function($name) { echo 'Hello World to ' . $name; }); $app->run(); REQUIRED PARAM
  26. 26 <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/', function()

    { echo 'Hello World from base route.'; }); //when using optional params, you have to define default value for function param $app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name; }); $app->run(); OPTIONAL PARAM
  27. 27 <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/', function()

    use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); //create link for route $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; }); $app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name; })->name('hello'); //using name for route $app->run(); NAMED ROUTES
  28. 28 <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/', function()

    use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; }); $app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name; })->name('hello') ->conditions(array('name' => '[A-Za-z]+')); //use only letters as param 'name' $app->run(); ROUTE CONDITIONS
  29. 29 <?php require 'Slim/Slim.php'; $app = new Slim(); /* ...

    */ $app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name; })->name('hello') ->conditions(array('name' => '[A-Za-z]+')); //redirect to default hello page $app->get('/redirect', function() use ($app) { $app->redirect($app->urlFor('hello')); }); $app->run(); REDIRECT
  30. 30 <?php require 'Slim/Slim.php'; $app = new Slim(); /* ...

    */ $app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name; })->name('hello') ->conditions(array('name' => '[A-Za-z]+')); //redirect to default hello page as 301, not 302 which is default $app->get('/redirect', function() use ($app) { $app->redirect($app->urlFor('hello'), 301); }); $app->run(); REDIRECT WITH STATUS
  31. 31 MIDDLEWARE <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/',

    function() { //this will be executed before main callable echo "Hello, I'm middleware <br>"; }, function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; }); /* ... */ $app->run();
  32. 32 MIDDLEWARE <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/',

    function() { //this will be executed before main callable echo "Hello, I'm middleware <br>"; }, function() { //this will be executed before main callable echo "And I'm second middleware <br>"; }, function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; }); /* ... */ $app->run();
  33. 33 MIDDLEWARE <?php require 'Slim/Slim.php'; $app = new Slim(); $app->get('/',

    function() { //this will be executed before main callable echo "Hello, I'm middleware <br>"; }, function() { //this will be executed before main callable echo "And I'm second middleware <br>"; }, function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; }); /* ... */ $app->run(); And
  34. 34 VIEW <?php //file index.php require 'Slim/Slim.php'; $app = new

    Slim(); $app->get('/', function() use ($app) { $url = $app->urlFor('hello', array('name' => 'Jimmy')); //default path is "__DIR__ . /templates" return $app->render('view.php', compact('url')); }); /* ... */ $app->run(); Hello World from base route. <br> Oh, link to hello page for Jimmy is <a href="<?php echo $url?>"><?php echo $url?></a>
  35. 35 HTTP CACHE - ETAG <?php require 'Slim/Slim.php'; $app =

    new Slim(); /* ... */ $app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } //auto ETag based on some id - next request with the same name will return 304 Not Modified $app->etag($name); echo 'Hello World to ' . $name; })->name('hello') ->conditions(array('name' => '[A-Za-z]+')); /* ... */ $app->run();
  36. 36 HTTP CACHE - TIME BASED <?php require 'Slim/Slim.php'; $app

    = new Slim(); /* ... */ $app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } $app->lastModified(1327305485); //cache based on time echo 'Hello World to ' . $name; })->name('hello') ->conditions(array('name' => '[A-Za-z]+')); /* ... */ $app->run();
  37. 37 FLASH MESSAGE <?php require 'Slim/Slim.php'; $app = new Slim();

    $app->get('/', function() use ($app) { $url = $app->urlFor('hello', array('name' => 'Jimmy')); return $app->render('view.php', compact('url')); }); //redirect to default page with flash message which will be displayed once $app->get('/redirect', function() use ($app) { $app->flash('info', "You were redirected"); $app->redirect($app->request()->getRootUri()); }); $app->run(); <?php echo $flash['info'] ?> Hello World from base route. <br> Oh, link to hello page for Jimmy is <a href="<?php echo $url?>"><?php echo $url?></a>
  38. 38 CUSTOM 404 <?php require 'Slim/Slim.php'; $app = new Slim();

    //define custom 404 page $app->notFound(function() { echo "I'm custom 404"; }); $app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } $possibleNames = array('Leonard', 'Sheldon', 'John Doe'); //when name not found, force 404 page if (array_search($name, $possibleNames) === false) { $app->notFound(); } echo 'Hello World to ' . $name; })->name('hello') ->conditions(array('name' => '[A-Za-z]+')); $app->run();
  39. 39 CUSTOM 404 <?php require 'Slim/Slim.php'; $app = new Slim();

    //define custom 404 page $app->notFound(function() { echo "I'm custom 404"; }); $app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } $possibleNames = array('Leonard', 'Sheldon', 'John Doe'); //when name not found, force 404 page if (array_search($name, $possibleNames) === false) { $app->notFound(); } echo 'Hello World to ' . $name; })->name('hello') ->conditions(array('name' => '[A-Za-z]+')); $app->run(); Custom
  40. 40 REST PATHS #1 <?php require 'Slim/Slim.php'; $app = new

    Slim(); //method name maps to HTTP method $app->get('/article'), function(/* ... */) {}); $app->post('/article'), function(/* ... */) {}); $app->get('/article/:id/'), function(/* ... */) {}); $app->put('/article/:id/'), function(/* ... */) {}); $app->delete('/article/:id/'), function(/* ... */) {});
  41. 41 REST PATHS #2 <?php require 'Slim/Slim.php'; $app = new

    Slim(); //same as previous one $app->map('/article'), function() use ($app) { if ($app->request()->isGet()) { /* ... */ } else if ($app->request()->isPost() { /* ... */ }) else { /* ... */ } })->via('GET', 'POST'); $app->map('/article/:id/'), function($id) use ($app) { //same as above })->via('GET', 'PUT', 'DELETE');
  42. ALSO: ENCRYPTED SESSIONS AND COOKIES, APPLICATION MODES, CUSTOM TEMPLATES AND

    MORE... 42
  43. 43 http://www.slimframework.com/ documentation/stable

  44. "But

  45. 45 PHP 5.2 <?php require 'Slim/Slim.php'; $app = new Slim();

    function index() { global $app; echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; } //last param must return true for is_callable call, so that it's valid $app->get('/', 'index'); /* ... */ $app->run();
  46. 46 PHP 5.2 <?php require 'Slim/Slim.php'; $app = new Slim();

    function index() { global $app; echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; } //last param must return true for is_callable call, so that it's valid $app->get('/', 'index'); /* ... */ $app->run(); Somebody
  47. 47 Source: http://tvtropes.org/pmwiki/pmwiki.php/Main/DeadUnicornTrope

  48. So

  49. 49 PHP 5.2 <?php class Controller { public static $app;

    public static function index() { echo 'Hello World from base route.<br>'; $url = self::$app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; } } require 'Slim/Slim.php'; $app = new Slim(); Controller::$app = $app; //last param must return true for is_callable call, so that it's also valid $app->get('/', array('Controller', 'index')); /* ... */ $app->run();
  50. But

  51. 51 PHP 5.2 <?php class Controller { protected $_app; public

    function __construct(Slim $app) { $this->_app = $app; } public function index() { echo 'Hello World from base route.<br>'; $url = $this->_app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; } } require 'Slim/Slim.php'; $app = new Slim(); $controller = new Controller($app); //last param must return true for is_callable call, so that it's also valid $app->get('/', array($controller, 'index')); /* ... */ $app->run();
  52. SO, DO YOU REALLY NEED THAT ? 52 Source: http://www.rungmasti.com/2011/05/swiss-army-knife/

  53. 53