-
Notifications
You must be signed in to change notification settings - Fork 0
01 Getting Started
Woof (Well Object-Oriented Framework) は、PHP アプリケーションの設計に「純粋関数」のアプローチを取り入れた、ユニークで堅牢な Web フレームワークです。
このページでは、Woof がなぜそのようなアーキテクチャを採用しているのか (設計目的) と、最小限のアプリケーションを動かすための手順 (クイックスタート) を解説します。
Woof は 「Web アプリケーションを、HTTP リクエストを入力として受け取り、HTTP レスポンスを出力として返す 1 つの関数とする」 という思想に基づいています。
一般的な PHP 開発では、処理の途中でデータベースにアクセスしたり、組み込み関数 (time() など) で現在時刻を取得したり、グローバル変数 ($_SESSION など) を直接書き換えたりすることが頻繁に行われます。しかし、これらの「外部状態への依存」や「副作用」がコードのあちこちに散らばると、以下のような問題が発生します。
- ユニットテスト (単体テスト) を書くのが極めて困難になる。
- キャッシュを安全に適用できる範囲が予測できなくなる。
- 処理を追うために、コードの実行順序や隠れた状態をすべて把握しなければならなくなる。
Woof はこれらの問題を解決するため、以下のルールをフレームワークのコアレベルで強制します。
-
副作用の隔離: 時間、乱数、ファイルシステム、セッションなどの「外部状態」は、すべて
Environment(環境コンテキスト) という単一のオブジェクトに閉じ込められ、外部から注入されます。 - 不変性 (Immutable) の徹底: リクエストやレスポンスなどの主要なオブジェクトはすべて不変として設計されており、一度生成された状態が予期せず書き換わることはありません。
-
ピュアな Controller: ビジネスロジックを担う
Controller(処理クラス) は、受け取ったRequestとEnvironmentのみを使って結果 (Response) を返す純粋な関数として振る舞います。
これにより、開発者は「予測不能なバグ」から解放され、極めて見通しが良く、確実にテスト可能なコードを記述できるようになります。
実際に Woof を使って、最もシンプルなアプリケーションを作成してみましょう。
Composer を使用して、プロジェクトに Woof をインストールします。
composer require apparel-php/woofまずは、入力を受け取って出力を返す関数となる Controller を作成します。ここでは単純なテキストを返すだけのクラスを定義します。
<?php
use Woof\Web\Controller;
use Woof\Web\WebEnvironment;
use Woof\Http\Request;
use Woof\Http\Response;
use Woof\Http\ResponseBuilder;
use Woof\Http\Response\TextBody;
use Woof\Http\Status;
class HelloController implements Controller
{
public function handle(Request $request, WebEnvironment $env): Response
{
// Request と Environment をもとに、純粋に Response を構築して返す
return (new ResponseBuilder())
->setStatus(Status::getOK())
->setBody(new TextBody("Hello, Woof!"))
->build();
}
}(※ 実際の開発では、レスポンスの構築処理をより簡潔に記述できる Operator クラスを使用しますが、ここでは基礎構造を理解するために ResponseBuilder を直接使用しています)
次に、すべてのリクエストの入り口となる index.php を作成します。ここでは、副作用のコンテナである Environment を構築し、Controller を呼び出します。
<?php
require_once __DIR__ . "/vendor/autoload.php";
// (先ほど作成した HelloController を読み込む想定です)
use Woof\Web\WebEnvironmentBuilder;
use Woof\Http\Request;
use Woof\Web\WebEnvironment;
use Woof\Web\Controller;
use Woof\Web\DefaultOutput;
// 1. 環境 (Environment) の構築
// ※ 必須となる Config と Resources のディレクトリを指定します
$env = (new WebEnvironmentBuilder())
->setConfigDir(__DIR__ . "/config")
->setResourcesDir(__DIR__ . "/resources")
->build();
// 2. クライアントからの Request オブジェクトを取得
$request = $env->getClientRequest();
// 3. ルーティングの定義
// ここではすべてのリクエストに対して HelloController を返します
$router = function (Request $request, WebEnvironment $env): Controller {
return new HelloController();
};
// 4. Controller の実行とレスポンスの生成
$processor = $router($request, $env);
$response = $processor->handle($request, $env);
// 5. クライアントへのレスポンス出力
$output = new DefaultOutput();
$output->send($response);これで、最低限の Woof アプリケーションが完成しました。ブラウザで index.php にアクセスすると、「Hello, Woof!」というテキストが表示されます。
次のステップである「コアコンセプト」の章では、このアプリケーションの裏側で Environment や Request がどのように安全なデータフローを実現しているのかを詳しく解説します。