Slide 1

Slide 1 text

An Introduction to Slim 3 Chris Cornutt / @enygma Dallas PHP 2016-01

Slide 2

Slide 2 text

Slim Framework Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs. At its core, Slim is a dispatcher that receives an HTTP request, invokes an appropriate callback routine, and returns an HTTP response. That’s it. Simple Lightweight Easy to use & customize

Slide 3

Slide 3 text

Slim Framework - Basic framework without the “bloat” - Not backwards compatible with Slim 2 - Easily extendible with middleware - Composer installable What’s included

Slide 4

Slide 4 text

Slim Framework v2 != v3 Major breaking changes because of PSR-7 compliance.

Slide 5

Slide 5 text

Slim Framework get('/hello/{name}', function (Request $request, Response $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();

Slide 6

Slide 6 text

PSR-7: HTTP Messages http://www.php-fig.org/psr/psr-7/ - HTTP message abstraction - From the PHP-FIG standards group - RequestInterface & Response Interface - Streams - Headers, URI, Uploads, Messages

Slide 7

Slide 7 text

Slim Framework get('/hello/{name}', function (Request $request, Response $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();

Slide 8

Slide 8 text

Slim Framework: Config [ ‘displayErrorDetails’ => true, ‘addContentLengthHeader’ => true, 'logger' => [ 'name' => 'slim-app', 'level' => Monolog\Logger::DEBUG, 'path' => __DIR__ . '/../logs/app.log', ] ] ]; $app = new \Slim\App($config); https://www.slimframework.com/docs/objects/application.html#application-configuration

Slide 9

Slide 9 text

Slim Framework: Routes get(‘/‘, function($request, $response) { echo ‘GET home’; }); $app->post(‘/‘, function($request, $response) { echo ‘POST home’; }); $app->run(); GET, POST, PUT, DELETE, OPTIONS, PATCH

Slide 10

Slide 10 text

Slim Framework: Routes $app->get(‘/hello/{name}’, function($request, $response, $args) { echo ‘GET home: ’.$args[‘name’]; }); $app->get(‘/id/{id:[0-9]+}’, function($request, $response, $args) { echo ‘GET id: ’.$args[‘id’]; }); $app->group(‘/user’, function() { $this->>get(‘/view’, function($request, $response) { echo ‘GET /user/view’; }); $this->post(‘/view’, function($request, $response) { echo ‘POST /user/view’; }); });

Slide 11

Slide 11 text

Slim Framework: Routes class HomeController { public function home() { echo ‘GET /user/home’; } } $container = $app->getContainer(); $container[‘HomeController’] = function() { return new \HomeController(); }; $app->get(‘/user/home’, ‘\HomeController:home’);

Slide 12

Slide 12 text

Slim Framework: DI $obj1 ]; $app = new \Slim\App($config); $app->get('/hello/{name}', function (Request $request, Response $response) { $object = $this->get(‘myobject’); }); $app->run(); https://www.slimframework.com/docs/objects/application.html#application-configuration Dependency injection

Slide 13

Slide 13 text

Slim Framework: DI getContainer(); $container[‘myclosure’] = function($container) { return (object)[‘foo’ => ‘bar’]; }; $app->get('/hello/{name}', function (Request $request, Response $response) { $object = $this->myclosure; }); $app->run(); https://www.slimframework.com/docs/objects/application.html#application-configuration Dependency injection

Slide 14

Slide 14 text

Slim Framework: Request get('/hello/{name}', function ($request, $response) { echo $request->getMethod().’ on /hello/{name}’; if ($request->isGet()) { echo ‘getting!’; } $query = $request->getUri()-> getQuery(); echo ‘Accepting: ‘.$request->getHeader(‘Accept’); $body = $this->getBody(); // a \Psr\Http\Message\StreamInterface echo $body; return $response; }); $app->run();

Slide 15

Slide 15 text

Slim Framework: Response get('/hello/{name}', function ($request, $response) { echo ‘HTTP status: ‘.$response->getStatusCode(); $newResponse = $response->withHeader(‘Content-Type’, ‘text/plain’); $body = $response->getBody(); $body->write(‘this is output back to the browser!’); // Adds “Content-Type: application/json" $newResponse = $response->withJson([‘foo’ => [‘bar’]); return $response; }); $app->run();

Slide 16

Slide 16 text

Slim Framework: Errors getContainer(); $container[‘errorHandler’] = function() { return function ($request, $response, $exception) use ($c) { return $c['response']->withStatus(500) ->withHeader('Content-Type', 'text/html') ->write('Something went wrong!'); }; }); $app->run();

Slide 17

Slide 17 text

Slim Framework: Middleware getBody()->write('BEFORE'); $response = $next($request, $response); $response->getBody()->write('AFTER'); return $response; } } $app = new \Slim\App(); $app->add(new \ExampleMiddleware()); $app->run();

Slide 18

Slide 18 text

Slim Framework: Middleware getBody()->write('BEFORE'); $response = $next($request, $response); $response->getBody()->write('AFTER'); return $response; } } $app = new \Slim\App(); $app->get(‘/‘, function($request, $response) { })->add(new \ExampleMiddleware()); $app->run();

Slide 19

Slide 19 text

Slim Framework: Twig composer require slim/twig-view getContainer(); $container[‘view’] = function() { return function ($request, $response, $exception) use ($c) { $view = new \Slim\Views\Twig(‘path/to/templates’, [ ‘cache’ => false ]); return $view; }); $app->run();

Slide 20

Slide 20 text

Slim Framework: Twig get(‘/‘, function($request, $response) { $data = [ ‘foo’ => ‘bar’ ]; return $this->view->render($response, ‘template.php’, $data); }); $app->run();

Slide 21

Slide 21 text

Demo time!

Slide 22

Slide 22 text

Resources https://www.codecourse.com/lessons/learn-slim-3 https://www.slimframework.com https://github.com/slimphp/Slim https://github.com/slimphp/Twig-View https://github.com/enygma/slim-app-skeleton https://github.com/chadicus/slim-oauth2