Dokumentace: https://www.slimframework.com/docs/v4/

// klasické includy - pozor jsou přejmenované
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
 
require __DIR__ . '/../vendor/autoload.php';
 
// vytvoření Slim aplikace
$app = AppFactory::create();
 
// definování routes, na kterých se něco děje
$app->get('/', function (Request $request, Response $response, $args) {
    $response->getBody()->write("Hello world!");
    return $response;
});
 
// spuštění aplikace
$app->run();

Vracení JSON dat

$data = ['name' => 'Bob', 'age' => 40];
$payload = json_encode($data);
 
$response->getBody()->write($payload);
 
// specifikování kódu odpovědi
$response = $response->withStatus(201); 
// potřeba hlavičkou říct, že vracím JSON
return $response->withHeader('Content-Type', 'application/json');

Dostávání JSON dat

  • je potřeba si předpřipravit aplikace pomocí Middleware
$app->addBodyParsingMiddleware();
 
$app->post('/customers', static function (Request $request, Response $response) {  
    // ...
    $userPayload = $request->getParsedBody();
    // jedná se o vstup od uživatele, mělo by proběhnout nějaké ošetření
    $username = $userPayload['name'];
    $password = $userPayload['password'];
    //...
}
  • v Postmanovi mohu JSON data zadat takhle (v raw formátu)

Middleware

  • kód, který běží před/po vykonáním kódu pro danou routu
  • příprava na JSON vstup od uživatele (Middleware od Oldy Malece)
namespace Books\Middleware;  
  
use Psr\Http\Message\ResponseInterface as Response;  
use Psr\Http\Message\ServerRequestInterface as Request;  
use Psr\Http\Server\MiddlewareInterface;  
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;  
  
class JsonBodyParserMiddleware implements MiddlewareInterface  
{  
    public function process(Request $request, RequestHandler $handler): Response  
    {  
        $contentType = $request->getHeaderLine('Content-Type');  
  
        if (str_contains($contentType, 'application/json')) {  
            $contents = json_decode(file_get_contents('php://input'), true);  
            if (json_last_error() === JSON_ERROR_NONE) {  
                $request = $request->withParsedBody($contents);  
            }  
        }  
        return $handler->handle($request);  
    }  
}
 
// ... 
// použití
 
$app->post(...) {
	$payload = $request->getParsedBody();
}
  • nebo $app->addBodyParsingMiddleware(); viz výše

  • autorizace přístupu k dané routě - můj Middleware

namespace Books\Middleware;  
  
use Psr\Http\Message\ServerRequestInterface as Request;  
use Psr\Http\Message\ResponseInterface as Response;  
use Psr\Http\Server\MiddlewareInterface;  
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;  
  
class AuthorizationMiddleware implements MiddlewareInterface  
{  
    public function process(Request $request, RequestHandler $handler): Response  
    {  
	    // nastavení vnitřního atributu
        $request = $request->withAttribute('approved', false);  
        $hashedLogin = $request->getHeader('Authorization');  
        if(!empty($hashedLogin)) {  
            $hashedLoginArr = explode(' ', $hashedLogin[0]);  
            if($hashedLoginArr[0] !== "Basic") {  
                return $handler->handle($request);  
            }  
 
			// druhá část hashe
            $hash = $hashedLoginArr[1]; 
            $data = base64_decode($hash);  
            if($data === false) {  
                return $handler->handle($request);  
            }  
            $credentials = explode(':', $data);  
            // hard-coded uživatel
            if($credentials[0] === 'admin' && $credentials[1] === 'pas$word') {  
                $request = $request->withAttribute('approved', true);  
            }  
        }  
        return $handler->handle($request);  
    }  
}
  • pak chci mít v daném Requestu v hlavičce přidanou novou hodnotu (screen z Postmana):
  • zde používám Basic Auth (wikipedia) a (en|de)coder