PHPフレームワーク「Aura v2」がクリーン過ぎるので試してみる post

スクリーンショット

日本でまだ誰も紹介していないようなので、今日は新しいPHPフレームワーク「Aura v2 -- Aura.Web_Project」を紹介します。

Lighter than Silex, and slimmer than Slim, the Aura.Web_Project package is a minimalist web-specific project framework that starts out small and grows only as you need it.
http://auraphp.com/blog/2013/12/12/aura-v2-web-project/

参考訳:Silexより軽く、Slimよりスリム、Aura.Web_Projectパッケージは、あなたが必要とする小さく始めて成長する、ミニマリストのWebに特化したプロジェクトのフレームワークです。

Aura Projectとは?

Aura Projectは、PHP 5.4以上向けの独立したライブラリパッケージを提供しています。「Libraries First, Framework Second」を主張しています。

日本では、BEAR.Sundayの@koriymさんがメンバーとして参加されています。

高品質のコンポーネントを提供するプロジェクトのフレームワークということで、Symfonyに似ています。しかし、Symfonyフレームワークが重量級のフルスタックであるのに対し、Auraは真逆で最小限のフレームワークというアプローチを採用しているようです。

Aura.Web_Projectパッケージとは?

Aura Projectの提供するパッケージを使った「minimal framework」です。

本当に最低限のものしかなく、

  • DIコンテナ
  • 設定システム
  • ルータとディスパッチャー
  • RequestおよびResponseクラス
  • ロギング

しかありません。

パッケージを自由に組み込んで、自分で作り込んでいくタイプ、いわゆるグルー・フレームワークです。

組み込んでいくパッケージはもちろんAura Projectのものでなくても構いません。

インストール

Composerよりインストールします。ここでは、プロジェクト名はAuraとします。

$ composer create-project --stability=dev aura/web-project Aura

PHPビルトインWebサーバを起動するには、以下のようにします。

$ cd Aura
$ php -S localhost:8000 -t web/

はい、簡単ですね。

デフォルトでは、tmp/{$mode}.logにログファイルが書き込まれますので、Webサーバを別に建てた場合など、必要ならパーミッションを変更してください。

$ chmod -R 777 tmp

Hello World(マイクロフレームワークスタイル)

それでは、Hello Worldを表示させてみましょう。

まず、マイクロフレームワーク風にルーティング設定ファイルにコントローラロジックを記述してみます。

ルーティングは、config/default/modify/web_router.phpに記載します。

config/default/modify/web_router.php:

<?php
/**
 * 
 * This file is part of Aura for PHP.
 * 
 * @package Aura.Web_Project
 * 
 * @license http://opensource.org/licenses/bsd-license.php BSD
 * 
 * @var Aura\Di\Container $di The DI container.
 * 
 */

// get the router service
$router = $di->get('web_router');

// example route for 'hello world' using request and response services
$request  = $di->get('web_request');
$response = $di->get('web_response');
$router->add('hello', '/Aura/hello/{name}')
    ->addValues([
        'controller' => function ($name) use ($request, $response) {
            $content = "Hello World! $name";
            $response->content->set(
                htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')
            );
        }
    ]);

// add routes below

ここで、以下がHellow World用のルーティング情報です。/Aura/hello/{name}にアクセスされた場合、定義したコントローラが実行されます。

$router->add('hello', '/Aura/hello/{name}')
    ->addValues([
        'controller' => function ($name) use ($request, $response) {
            $content = "Hello World! $name";
            $response->content->set(
                htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')
            );
        }
    ]);

ここではクロージャでレスポンスのコンテンツをセットしています。

localhost:8000/Aura/hello/auraにアクセスすると、「Hello World! aura」と表示されます。

Hello World(フルスタックスタイル)

次は、MVCフレームワーク風にコントローラクラスを作成してみます。

src/App/Controllersフォルダを作成し、そこにHelloController.phpを作成します。

src/App/Controllers/HelloController.php:

<?php
/**
 * {$PROJECT_PATH}/src/App/Controllers/HelloController.php
 */
namespace App\Controllers;

use Aura\Web\Request;
use Aura\Web\Response;

class HelloController
{
    public function __construct(Request $request, Response $response)
    {
        $this->request  = $request;
        $this->response = $response;
    }

    public function say($name)
    {
        $content = "Hello World! $name";
        $this->response->content->set(
            htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8')
        );
    }
}

続いて、DIコンテナでHelloControllerを定義します。以下のファイルの最後に以下を追加します。

config/default/define.php:

$di->params['App\Controllers\HelloController'] = [
    'request'  => $di->lazyGet('web_request'),
    'response' => $di->lazyGet('web_response'),
];

ディスパッチャーにHelloControllerを設定します。以下のファイルの最後に以下を追加します。

config/default/modify/web_dispatcher.php:

$dispatcher->setObject('hello_c', $di->lazyNew('App\Controllers\HelloController'));

最後にルーティング情報を変更します。

config/default/modify/web_router.php:

$router->add('hello', '/Aura/hello/{name}')
    ->addValues([
        'controller' => 'hello_c',
        'action'     => 'say',
    ]);

localhost:8000/Aura/hello/auraにアクセスすると、「Hello World! aura」と表示されます。

まとめ

このようにAura.Web_Projectは非常にシンプル、クリーンでわかりやすい構造になっています。

フレームワークについての知識がないと理解できないコードはありません。コントローラもフレームワークに密結合していません。

Aura.Web_Projectに興味を持たれた方は、Paul M. Jones氏の書かれた「A Peek At Aura v2 -- Aura.Web_Project, The Micro/Macro Web Framework」を読まれるとよいでしょう。

また、あのBEAR.SundayもAuraの提供するパッケージをたくさん使っているということで、Auraの提供するパッケージの品質も期待できそうです。

参考

Date: 2014/02/05

Tags: aura, php