Slim Framework 매뉴얼 Request (요청) #3 파일, 헬퍼, 속성


요청 (Request)

Slim 앱의 경로 및 미들웨어에는 웹 서버가 수신한 현재 HTTP 요청을 나타내는 PSR-7 요청 개체가 제공됩니다. 요청 개체는 HTTP 요청 메서드, 헤더 및 본문을 검사하고 조작할 수 있는 PSR-7 ServerRequestInterface를 구현합니다.

업로드된 파일 (Uploaded Files)

$_FILES에 업로드된 파일은 요청 개체의 ‘getUploadedFiles()’ 메서드에서 사용할 수 있습니다. ‘input’ 요소의 이름으로 키 지정된 배열을 반환합니다.

$files = $request->getUploadedFiles();

Figure 11: 업로드된 파일 가져오기

Each object in the $files array is an instance of Psr\Http\Message\UploadedFileInterface and supports the following methods:

$files 배열의 각 객체는 Psr\Http\Message\UploadedFileInterface 의 인스턴스이며 다음과 같은 메소드를 지원합니다.

  • getStream()
  • moveTo($targetPath)
  • getSize()
  • getError()
  • getClientFilename()
  • getClientMediaType()

POST 양식을 사용하여 파일을 업로드하는 방법에 대해서는 cookbook을 참조하십시오.

요청 헬퍼 (Request Helpers)

Slim의 PSR-7 Request 구현체는 HTTP 요청을 추가로 검사하는 데 도움이 되는 이러한 추가적인 독점적 방법을 제공합니다.

XHR 요청 탐지

You can detect XHR requests by checking if the header X-Requested-With is XMLHttpRequest using the Request’s getHeaderLine() method.

Request의 getHeaderLine() 방법으로 헤더 ‘X-Requested-With’가 ‘XMLHtpRequest’인지 확인하여 XHR 요청을 탐지할 수 있습니다.

POST /path HTTP/1.1
Host: example.com
Content-type: application/x-www-form-urlencoded
Content-length: 7
X-Requested-With: XMLHttpRequest

foo=bar

Figure 13: XHR 요청 예.

if ($request->getHeaderLine('X-Requested-With') === 'XMLHttpRequest') {
   // Do something
}

컨텐츠 유형 (Content Type)

요청 개체의 ‘getHeaderLine()’ 메서드를 사용하여 HTTP 요청의 content type을 가져올 수 있습니다.

$contentType = $request->getHeaderLine('Content-Type');

컨텐츠 길이 (Content Length)

요청 개체의 ‘getHeaderLine()’ 메서드를 사용하여 HTTP 요청의 Content Lenght를 가져올 수 있습니다.

$length = $request->getHeaderLine('Content-Length');

서버 매개변수

수신 요청 환경과 관련된 데이터를 가져오려면 getServerParams()를 사용해야 합니다.

예를 들어, 단일 서버 매개변수를 가져오려면:

$params = $request->getServerParams();
$authorization = $params['HTTP_AUTHORIZATION'] ?? null;

POST 매개 변수

요청 방법이 ‘POST’이고 ‘Content-Type’이 ‘application/x-ww-form-urlencoded’ 또는 ‘multipart/form-data’인 경우 다음과 같이 모든 ‘POST’ 매개 변수를 검색할 수 있습니다.

// Get all POST parameters
$params = (array)$request->getParsedBody();

// Get a single POST parameter
$foo = $params['foo'];

라우팅 객체 (Route Object)

미들웨어에서는 경로의 매개 변수가 필요한 경우가 있습니다.

이 예에서는 먼저 사용자가 로그인했는지 확인하고 두 번째로 사용자에게 보려는 특정 비디오를 볼 수 있는 권한이 있는지 확인합니다.

$app
  ->get('/course/{id}', Video::class . ':watch')
  ->add(PermissionMiddleware::class);

<?php
​
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Routing\RouteContext;
​
class PermissionMiddleware
{
    public function __invoke(Request $request, RequestHandler $handler)
    {
        $routeContext = RouteContext::fromRequest($request);
        $route = $routeContext->getRoute();
        
        $courseId = $route->getArgument('id');
        
        // do permission logic...
        
        return $handler->handle($request);
    }
}

경로 내에서 기본 경로 가져오기 (Obtain Base Path From Within Route)

경로 내에서 기본 경로를 가져오려면 다음을 수행합니다.

<?php

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Slim\Routing\RouteContext;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->get('/', function(Request $request, Response $response) {
   $routeContext = RouteContext::fromRequest($request);
   $basePath = $routeContext->getBasePath();
   // ...
   
   return $response;
});

속성 (Attributes)

PSR-7을 사용하면 추가 처리를 위해 요청 객체에 객체/값을 주입할 수 있습니다. 애플리케이션에서 미들웨어는 종종 경로 폐쇄에 정보를 전달해야 하며, 그 방법은 속성을 통해 요청 객체에 정보를 추가하는 것입니다.

예: 요청 개체에 값 설정.

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
​
$app->add(function (Request $request, RequestHandler $handler) {
    // Add the session storage to your request as [READ-ONLY]
    $request = $request->withAttribute('session', $_SESSION);
    
    return $handler->handle($request);
});

예: 값을 검색하는 방법입니다.

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

$app->get('/test', function (Request $request, Response $response) {
// Get the session from the request
$session = $request->getAttribute('session');

$response->getBody()->write('Yay, ' . $session['name']);

return $response;
});

요청 개체에도 대량 기능이 있습니다. ‘$request->getAttributes() 및 ‘$request->withAttributes()