'Programming/Slim'에 해당하는 글 17건

Slim 3 은 CSRF (Cross-Site Request Forgery) 로부터 어플리케이션을 보호하기 위해 독립적인 slimphp/Slim-Csrf PHP 컴포넌트를 사용할 수 있다.

이 컴포넌트는 클라이언트 측의 HTML form 으로부터 오는 각 POST 요청에 대해 유일한 토큰을 생성한다.



설치


프로젝트 루트 디렉토리에서 다음 bash 명령을 실행한다.


$ composer require slim/csrf
cs



사용


slimphp/Slim-Csrf 컴포넌트는 어플리케이션 미들웨어를 포함한다. 다음과 같이 컴포넌트를 추가한다.


// Add middleware to the application
$app = new \Slim\App;
$app->add(new \Slim\Csrf\Guard);
 
// Create your application routes...
 
// Run application
$app->run();
cs



CSRF 토큰 이름과 값 가져오기


CSRF 토큰의 이름과 값은 각 요청에 대해 유일하며, 가장 최근의 CSRF 토큰의 이름과 값은 PSR-7 요청 객체에 속성으로 사용할 수 있다.

다음과 같이 현재 CSRF 토큰 이름과 값을 가져올 수 있다.


$app->get('/foo'function ($req$res$args) {
    // Fetch CSRF token name and value
    $name = $req->getAttribute('csrf_name');
    $value = $req->getAttribute('csrf_value');
 
    // TODO: Render template with HTML form and CSRF token hidden field
});
cs


템플릿에 CSRF 토큰 이름과 값을 전달하면, HTML form 의 hidden 필드에 저장하여 POST 요청으로 전송될 것이다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Slim HTTP Caching

Programming/Slim 2016. 3. 14. 23:22

Slim 3 는 HTTP 캐싱을 위해 독립적인 slimphp/Slim-HttpCache PHP 컴포넌트를 사용할 수 있다.

이 컴포넌트를 사용하면, 어플리케이션 출력이 클라이언트 측 캐시에 얼마나 유지될 것인지 제어하는 Cache, Expires, ETag, Last-Modified 헤더들을 포함하는 응답을 생성하고 반환할 수 있다.



설치


프로젝트 루트 디렉토리에서 다음 bash 명령을 실행한다.


$ composer require slim/http-cache
cs



사용


slimphp/Slim-HttpCache 컴포넌트는 서비스 제공자와 어플리케이션 미들웨어를 포함하며 다음과 같이 추가할 수 있다:


// Register service provider with the container
$container = new \Slim\Container;
$container['cache'= function () {
    return new \Slim\HttpCache\CacheProvider();
};
 
// Add middleware to the application
$app = new \Slim\App($container);
$app->add(new \Slim\HttpCache\Cache('public'86400));
 
// Create your application routes...
 
// Run application
$app->run();
cs



ETag


원하는 ETag 헤더로 Response 객체를 생성하기 위해 서비스 제공자의 withEtag() 메소드를 사용할 수 있다.

이 메소드는 PSR-7 응답 객체를 받고, 새로운 HTTP 헤더로 복제된 PSR7 응답을 반환한다.


$app->get('/foo'function ($req$res$args) {
    $resWithEtag = $this->cache->withEtag($res'abc');
 
    return $resWithEtag;
});
cs



Expires


원하는 Expires 헤더로 Response 객체를 생성하기 위해 서비스 제공자의 withExpires() 메소드를 사용할 수 있다.

이 메소드는 PSR-7 응답 객체를 받고, 새로운 HTTP 헤더로 복제된 PSR7 응답을 반환한다.


$app->get('/bar',function ($req$res$args) {
    $resWithExpires = $this->cache->withExpires($restime() + 3600);
 
    return $resWithExpires;
});
cs



Last-Modified


원하는 Last-Modified 헤더로 Response 객체를 생성하기 위해 서비스 제공자의 withLastModified() 메소드를 사용할 수 있다.

이 메소드는 PSR-7 응답 객체를 받고, 새로운 HTTP 헤더로 복제된 PSR7 응답을 반환한다.


//Example route with LastModified
$app->get('/foobar',function ($req$res$args) {
    $resWithLastMod = $this->cache->withLastModified($restime() - 3600);
 
    return $resWithLastMod;
});
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Slim Templates

Programming/Slim 2016. 3. 13. 01:40

Slim 은 MVC 프레임워크 같은 뷰 레이어가 없다. Slim 에서 "View" 란 HTTP 응답이다.

각 Slim 어플리케이션 라우트는 적절한 PSR-7 응답 객체를 준비하고 반환한다.

Slim 프로젝트는 PSR-7 Response 객체에 템플릿을 적용(render)하도록 Twig-ViewPHP-View 컴포넌트를 제공한다.



The slim/twig-view component


Twig-View PHP 컴포넌트는 어플리케이션에 Twig 템플릿을 렌더링해 준다.

이 컴포넌트는 패키지리스트에서 이용 가능하며 Composer 로 쉽게 설치할 수 있다.


$ composer require slim/twig-view
cs


설치하였으면, Slim app 의 컨테이너에 서비스로 컴포넌트를 등록한다.


<?php
// Create app
$app = new \Slim\App();
 
// Get container
$container = $app->getContainer();
 
// Register component on container
$container['view'= function ($container) {
    $view = new \Slim\Views\Twig('path/to/templates', [
        'cache' => 'path/to/cache'
    ]);
    $view->addExtension(new \Slim\Views\TwigExtension(
        $container['router'],
        $container['request']->getUri()
    ));
 
    return $view;
};
cs


"cache" 를 사용하지 않기 위해 false 로 지정할 수 있고, 개발 환경에서 유용한 'auto_reload' 옵션도 살펴 본다.

더 많은 정보는 Twig environment options 를 찾아 본다.

이제 템플릿을 적용하기 위해 app 라우트에 slim/twig-view 컴포넌트 서비스를 사용하고, PSR-7 Response 객체에 작성할 수 있다.


// Render Twig template in route
$app->get('/hello/{name}'function ($request$response$args) {
    return $this->view->render($response'profile.html', [
        'name' => $args['name']
    ]);
})->setName('profile');
 
// Run app
$app->run();
cs


예제에서, 라우트 콜백안에 호출된 $this->view 는 view 컨테이너 서비스로부터 반환된 \Slim\Views\Twig 인스턴스를 참조한다.

\Slim\Views\Twig 인스턴스의 render() 메소드는 첫번째 매개변수로 PSR-7 Response 객체를, 두번째 매개변수로 Twig 템플릿 경로를, 마지막 매개변수로 템플릿 변수의 배열을 받는다.

render() 메소드는 본문이 Twig 템플릿으로 적용된 새로운 PSR-7 Response 객체를 반환한다.


path_for() method

slim/twig-view 컴포넌트는 Twig 템플릿으로 사용자 정의 path_for(route name, placeholder and values) 함수를 노출한다.

Slim 어플리케이션의 모든 라우터에 완전한 URL 들을 생성하기 위해 이 함수를 사용할 수 있다.

두번째 매개변수의 키는 라우트의 패턴 placeholder 이다.

아래 예제는 위 Slim 어플리케이션 예제에서 작성한 profile 이란 라우트에 대한 URL 링크를 생성하는 Twig 템플릿이다.


{% extends "layout.html" %}
 
{% block body %}
<h1>User List</h1>
<ul>
    <li><a href="{{ path_for('profile', { 'name': 'josh' }) }}">Josh</a></li>
</ul>
{% endblock %}
cs



The slim/php-view component


PHP-View PHP 컴포넌트는 PHP 템플릿을 렌더링 해준다.

이 컴포넌트는 패키지리스트에서 이용 가능하며 Composer 로 쉽게 설치할 수 있다.


$ composer require slim/php-view
cs


설치하였으면, Slim app 의 컨테이너에 서비스로 컴포넌트를 등록한다.


<?php
// Create app
$app = new \Slim\App();
 
// Get container
$container = $app->getContainer();
 
// Register component on container
$container['view'= function ($container) {
    return new \Slim\Views\PhpRenderer('path/to/templates');
};
cs


PHP view 를 렌더링하기 위해 view 컴포넌트를 사용한다.


// Render Twig template in route
$app->get('/hello/{name}'function ($request$response$args) {
    return $this->view->render($response'profile.html', [
        'name' => $args['name']
    ]);
})->setName('profile');
 
// Run app
$app->run();
cs



Other template systems


위 두가지 컴포넌트 외에도 PSR-7 Response 객체의 본문으로 렌더링된 템플릿 출력이 가능한 PHP 템플릿은 무엇이든 사용할 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

어플리케이션의 현재 라우트에 접근할 필요가 있다면,
'route' 매개변수로 요청 클래스의 getAttribute 메소드를 호출하고 Slim\Route 클래스의 인스턴스인 현재 라우트를 반환할 것이다.

그것으로부터 getName() 을 이용하여 라우트의 이름을 얻거나 getMethods() 로 이 라우트에 제공되는 메소드를 얻을 수 있다.

app 의 미들웨어로부터 라우트에 접근하려면 설정에서 determineRouteBeforeAppMiddleware 를 true 로 지정하거나 getAttribute('route') 가 null 을 반환해야 한다.

라우트는 항상 라우트 미들웨어에서 사용 가능하다.


use Slim\Http\Request;
use Slim\Http\Response;
use Slim\App;
 
$app = new App([
    'settings' => [
        // Only set this if you need access to route within middleware
        'determineRouteBeforeAppMiddleware' => true
    ]
])
 
// routes...
$app->add(function (Request $request, Response $response, callable $next) {
    $route = $request->getAttribute('route');
    $name = $route->getName();
    $group = $route->getGroup();
    $methods = $route->getMethods();
    $arguments = $route->getArguments();
 
    // do something with that information
 
    return $next($request$response);
});
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

현재 클라이언트의 IP 주소를 검색하는 가장 좋은 방법은 rka-ip-address-middleware 같은 미들웨어 컴포넌트를 사용하는 것이다.



설치


$ composer require akrabat/rka-ip-address-middleware
cs



사용


신뢰가는 프록시 리스트(varnish servers 등)를 제공하는 App 으로 미들웨어를 등록한다.


$checkProxyHeaders = true;
$trustedProxies = ['10.0.0.1''10.0.0.2'];
$app->add(new RKA\Middleware\IpAddress($checkProxyHeaders$trustedProxies));
 
$app->get('/'function ($request$response$args) {
    $ipAddress = $request->getAttribute('ip_address');
 
    return $response;
});
cs


미들웨어는 요청 속성에서 클라이언트의 IP 주소를 저장하고 $request->getAttribute('ip_address') 로 접근할 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,