Slim Framework バージョン 2.3.0

Slim Framework バージョン 2.3.0 には、多くの新しい便利な機能が含まれています。前のバージョンとの後方互換性があります。公式ドキュメントを更新する間、Slim の新機能の利用開始に役立つヒントをいくつかご紹介します。

バージョン 2.3.0 をダウンロード

ルートグループ

ルートをグループ化できるようになりました。これにより、各ルート定義でルート URL のプレフィックス(例:「/api/users」)を重複させることを回避できます。

/**
 * API route group
 */
$app->group('/api', function () use ($app) {
    /**
     * User route group
     */
    $app->group('/users', function () use ($app) {
        /**
         * New user --> GET /api/users/new
         */
        $app->get('/new', function () use ($app) {
            $app->render('new_user.html');
        });
    });

    /**
     * Role route group
     */
    $app->group('/roles', function () use ($app) {
        /**
         * New role --> GET /api/roles/new
         */
        $app->get('/new', function () use ($app) {
            $app->render('new_role.html');
        });
    });
});

リソースロケータ

Slim はリソースロケータを提供するようになりました。これにより、Slim アプリケーションにオブジェクトを簡単に注入したり、Slim アプリケーションの内部コンポーネント(例:リクエストオブジェクト)をすばやく変更したりできます。

リソースロケータを使用すると、任意のリソースを Slim アプリケーションに注入できます。

// Set value
$app->foo = 'bar';

// Get value
$value = $app->foo;
You can also inject a resource as a closure that will be invoked whenever the given resource is requested.

// Set value
$app->now = function () {
    return time();
};

// Get value
$now = $app->now;

リソースをクロージャとして注入すると、リソースが要求されるたびに呼び出されます。リソースを一度だけ計算して、その後は毎回同じ状態を維持する必要がある場合(つまり、シングルトン)、以下のようにする必要があります。

// Set singleton value
$app->container->singleton('db', function () {
    return new PDO('sqlite:database.db');
});

// Get singleton value
$pdo = $app->db;

Slim の内部オブジェクト(Environment、Request、Response、View、Log など)の多くは、上記のシングルトンメソッドを使用して注入されます。これらのオブジェクトのいずれかに対して、Slim のデフォルトの実装を簡単にオーバーライドできます。

$app = new \Slim\Slim();

// Override Slim's default Response object
$app->container->singleton('response', function () {
    return new \My\Response();
});

Slim は、内部の Response オブジェクトに、カスタムの \My\Response クラスを使用するようになります。Slim は現在、内部オブジェクトに必要なインターフェイスを規定していません。Slim の内部オブジェクトをオーバーライドする場合は、内部オブジェクトをサブクラスで拡張することをお勧めします。次のポイントリリースでは、Slim の期待値をインターフェイスで規定し、Slim のデフォルトの内部オブジェクトをオーバーライドする際の柔軟性が高まります。

アクセサー

Slim はリソースロケータを使用するため、Slim アプリケーションインスタンスのパブリックプロパティとして、内部アプリケーションオブジェクト(例:Request および Response)に直接アクセスできるようになりました。以前は、request() や response() のようなアクセサーメソッドに依存していましたが、今では次の操作を簡単に行うことができます。

$app = new \Slim\Slim();
$app->get('/', function () use ($app) {
    // Get environment
    $env = $app->environment;

    // Get request
    $req = $app->request;

    // Get response
    $res = $app->response;

    // Get view
    $view = $app->view;

    // Get log
    $log = $app->log;
});

Set インターフェース

バージョン 2.3.0 には、新しい \Slim\Helper\Set インターフェースが含まれています。このインターフェースは、Request および Response オブジェクトのクッキーやヘッダーなど、Slim アプリケーションコレクションの操作方法を簡略化および標準化します。インターフェースは以下のとおりです。

set($key, mixed $value);
get($key, mixed $defaultValue = null);
replace(array $items);
all();
keys();
has($key);
remove($key);
clear();
count();

\Slim\Helper\Set クラスは、ArrayAccess、Countable、および IteratorAggregate インターフェースも実装しています。

ヘッダー

Request オブジェクトと Response オブジェクトの両方に、パブリックな headers プロパティが含まれています。このプロパティは \Slim\Helper\Set のインスタンスです。このインターフェースを使用すると、次のように Request オブジェクトのヘッダーを簡単にフェッチできます。

$headers = $app->request->headers->all();
$header = $app->request->headers->get('Content-Type');

Response オブジェクトのヘッダーも、次のように簡単に操作できます。

$app->response->headers->set('X-Foo', 'Bar');

クッキー

Request オブジェクトと Response オブジェクトの両方に、パブリックな cookies プロパティが含まれています。このプロパティは \Slim\Helper\Set のインスタンスです。このインターフェースを使用すると、次のように Request オブジェクトのクッキーを簡単にフェッチできます。

$cookies = $app->request->cookies->all();
$cookie = $app->request->cookies->get('foo');

Response オブジェクトのクッキーも、次のように簡単に操作できます。

$app->response->cookies->set('foo', 'bar');

Response オブジェクトにクッキーを設定するときに、追加のクッキーパラメーターを定義するために、クッキーの値として配列を渡すこともできます。

$app->response->cookies->set('foo', array(
    'value' => 'bar',
    'domain' => 'example.com',
    'path' => '/',
    'expires' => time() + 3600,
    'secure' => true,
    'httponly' => true
));

Slim は Response クッキーの管理に \Slim\Helper\Set インターフェースを使用するようになったため、クッキーの値は Slim アプリケーションライフサイクルの最後にシリアル化および暗号化されます。つまり、クッキーが最初に設定された後でも、新しい \Slim\Helper\Set インターフェースを使用してクッキー値を操作し続けることができます。

この新しいインターフェースは、Response オブジェクトの実装にのみ適用されることに注意してください。これまでと同様に、\Slim\Slim::setCookie() および \Slim\Slim::getCookie() メソッドを引き続き使用できます。

Slim エクストラ

現在の Slim-Extras リポジトリは大幅な変更を受けています。ファーストパーティのカスタムビューを Twig および Smarty のみに大幅に簡略化します。その他のサードパーティビューは非推奨になります。

また、Slim-Extras リポジトリをより具体的なリポジトリに再編成します。カスタムビューは Slim-Views リポジトリに配置されます。Twig および Smarty の両方のカスタムビューは、大幅な(破壊的な可能性のある)変更を受けました。更新については、それぞれの README ファイルを必ずお読みください。

また、サードパーティの Slim Framework アドオン(例:ミドルウェア、ビュー、ロガー)を探索および検索するのに役立つ、Slim Framework Webサイトに新しいセクションを構築します。この新しい追加機能は近日中に登場します。更新にご期待ください。

完全な変更ログ

  • ルートグループを追加
  • リソースロケータを追加
  • HTTP PATCH メソッドのサポートを追加
  • 新しい \Slim\Helper\Set インターフェースを追加
  • \Slim\Slim::urlFor メソッドの XSS エクスプロイトを修正
  • デフォルトのエラーハンドラー \Slim\Slim::handleErrors を簡略化
  • デバッグモードでない場合、\Slim\Middleware\PrettyExceptions を削除
  • HTTP ヘッダーに HTTP_ プレフィックスが存在する場合は保持
  • \Slim\Http\Headers および \Slim\Http\Cookies に \Slim\Helper\Set インターフェースを追加
  • 環境、リクエスト、レスポンス、ルーター、ログ、およびビューがパブリックプロパティになるように \Slim\Slim を更新
  • headers および cookies が \Slim\Helper\Set を実装するパブリックプロパティになるように \Slim\Http\Request および \Slim\Http\Response を更新。
  • \Slim\Http\Response メソッド setStatus()getStatus()setBody()getBody()、および getLength() を追加
  • Response オブジェクトのクッキーとヘッダーが、アプリケーションライフサイクルの最後にシリアル化および暗号化されるように \Slim\Http\Response オブジェクトを更新。
  • PSR-3 インターフェースで \Slim\Log を更新
  • \Slim\Log::warn() を非推奨とし、\Slim\Log::warning() に置き換え
  • \Slim\Log::fatal() を非推奨とし、\Slim\Log::critical() に置き換え
  • \Slim\Http\Request メソッド cookies() および headers() を非推奨化
  • \Slim\Http\Response メソッド headers()header()length()body()status() を非推奨化
  • \Slim\Http\Response インターフェース ArrayAccess、Countable、および IteratorAggregate を非推奨化