Micropage in microtime using microframework

53
1

description

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

Transcript of Micropage in microtime using microframework

1

2

3

PAGE

4

PAGETIME

5

PAGETIMEFRAMEWORK

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 ;]

SOMETIMES, FULL STACK FRAMEWORK IS AN

OVERHEAD

7

THIS IS WHY WE HAVE MICROFRAMEWORKS

8

9

10

USUALLY, DOES SMALL AMOUT OF THINGS.

11

USUALLY, DOES SMALL AMOUT OF THINGS.

12

ROUTING

USUALLY, DOES SMALL AMOUT OF THINGS.

13

ROUTING

HTTP CACHING

USUALLY, DOES SMALL AMOUT OF THINGS.

14

ROUTING

TEMPLATES

HTTP CACHING

15

I����������� ������������������  hope,����������� ������������������  because...

16

17

����������� ������������������  "640K����������� ������������������  ought����������� ������������������  to����������� ������������������  be����������� ������������������  enough����������� ������������������  for����������� ������������������  anyone."

18

����������� ������������������  "640K����������� ������������������  ought����������� ������������������  to����������� ������������������  be����������� ������������������  enough����������� ������������������  for����������� ������������������  anyone."

BTW.����������� ������������������  Probably����������� ������������������  he����������� ������������������  didn't����������� ������������������  say����������� ������������������  that:HTTP://QUOTEINVESTIGATOR.COM/2011/09/08/640K-ENOUGH/

"OK,����������� ������������������  OK,����������� ������������������  I����������� ������������������  want����������� ������������������  meat!"

19

read����������� ������������������  as:����������� ������������������  "Show����������� ������������������  me����������� ������������������  some����������� ������������������  code����������� ������������������  please"

Little����������� ������������������  framework����������� ������������������  =����������� ������������������  

little����������� ������������������  amount����������� ������������������  of����������� ������������������  "meat"

20

I'LL USE

21

http://www.slimframework.com/

BUT THERE ARE OTHERS:

22

http://flightphp.com/

http://www.limonade-php.net

http://silex.sensiolabs.org/

SLIM EXAMPLES

23

24

<?php

require 'Slim/Slim.php';

$app = new Slim();

$app->get('/', function() { echo 'Hello World from base route.'; });

$app->run();

BASE ROUTING

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

<?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

<?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

<?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

<?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

<?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

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

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

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����������� ������������������  so����������� ������������������  on����������� ������������������  -����������� ������������������  everything����������� ������������������  before����������� ������������������  last����������� ������������������  callable����������� ������������������  is����������� ������������������  middleware

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

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

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

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

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

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����������� ������������������  error����������� ������������������  page����������� ������������������  (500)����������� ������������������  also����������� ������������������  possible

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

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');

ALSO: ENCRYPTED SESSIONS AND

COOKIES, APPLICATION MODES, CUSTOM TEMPLATES

AND MORE...

42

"But����������� ������������������  I����������� ������������������  can't����������� ������������������  use����������� ������������������  PHP����������� ������������������  5.3.����������� ������������������  What����������� ������������������  then?"

44

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

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����������� ������������������  said,����������� ������������������  that:����������� ������������������  "everytime,����������� ������������������  when����������� ������������������  you����������� ������������������  use����������� ������������������  global,����������� ������������������  unicorn����������� ������������������  dies"����������� ������������������  ;)����������� ������������������  

So����������� ������������������  ok,����������� ������������������  second����������� ������������������  approach:

48

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();

But����������� ������������������  IMHO����������� ������������������  this����������� ������������������  one����������� ������������������  is����������� ������������������  the����������� ������������������  best����������� ������������������  solution:

50

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();

SO, DO YOU REALLY NEED THAT ?

52

Source: http://www.rungmasti.com/2011/05/swiss-army-knife/

53