PHP code example of apparel-php / woof

1. Go to this page and download the library: Download apparel-php/woof library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

apparel-php / woof example snippets




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();
    }
}



$appRoot = dirname(__DIR__);
;
use Woof\Http\Request;
use Woof\Web\WebEnvironment;
use Woof\Web\Controller;
use Woof\Web\DefaultOutput;

// 1. 副作用を集約する Environment の構築
$env = (new WebEnvironmentBuilder())
    ->setConfigDir("{$appRoot}/config")
    ->setResourcesDir("{$appRoot}/resources")
    ->build();

// 2. クライアントからの Request オブジェクトを取得
$request = $env->getClientRequest();

// 3. ルーティング関数
// Request と Environment を評価し、対応する Controller を返す関数を定義します。
// マッチするルートがない場合は、デフォルト値として
// 404 専用の Controller を返すのが綺麗な設計です。
$router = function (Request $request, WebEnvironment $env): Controller {
    return new HelloController();
};

// 4. ルーティングの実行と、レスポンスの生成
$controller = $router($request, $env);
$response   = $controller->handle($request, $env);

// 5. レスポンスの出力
$output = new DefaultOutput();
$output->send($response);



use Woof\Web\View;
use Woof\Resources;
use Woof\Web\Context;
use Binder\Template;

class TimeView implements View
{
    /** @var int */
    private $time;
    
    /** @var int */
    private $lastVisited;

    // View が描画に必要とする状態 (現在時刻と前回の訪問時刻) をコンストラクタで受け取ります
    public function __construct(int $time, int $lastVisited = 0)
    {
        $this->time        = $time;
        $this->lastVisited = $lastVisited;
    }

    public function getContentType(): string
    {
        return "text/html; charset=UTF-8";
    }

    public function render(Resources $resources, Context $context): string
    {
        // 1. Resources から HTML の雛形を読み込む
        $html = $resources->get("time.html");

        // 2. 挨拶文の構築
        $greeting = $this->lastVisited > 0
            ? "前回のアクセスは " . date("Y/m/d H:i:s", $this->lastVisited) . " でした。"
            : "はじめまして。";

        // 3. Context を使ってリンク先の URL を書式化する
        $homeUrl    = $context->formatHref("/");
        $privacyUrl = $context->formatHref("/privacy");
        $contactUrl = $context->formatHref("/contact", ["ref" => "timepage"]);

        // 4. Binder を使ってプレースホルダーに値をセットし、レンダリング結果を返す
        return Template::readMarkup($html)
            ->entry()
            ->set("greeting", $greeting)
            ->set("time", date("Y/m/d H:i:s", $this->time))
            ->set("home_url", $homeUrl)
            ->set("privacy_url", $privacyUrl)
            ->set("contact_url", $contactUrl)
            ->render();
    }
}



use Woof\Web\Controller;
use Woof\Web\WebEnvironment;
use Woof\Http\Request;
use Woof\Http\Response;
use Woof\Web\Operator;

class TimeController implements Controller
{
    public function handle(Request $request, WebEnvironment $env): Response
    {
        // 1. Cookie から前回の訪問時刻を取得 (未訪問の場合は 0 となる)
        $lastVisited = (int) $request->getCookie("last_visited");

        // 2. 副作用の隔離: `time()` 関数ではなく Environment (Clock) から現在時刻を取得
        $now = $env->now();

        // 3. Operator を使ってレスポンスを構築
        return (new Operator($request, $env))
            ->setCookie("last_visited", (string) $now)
            ->setView(new TimeView($now, $lastVisited))
            ->build();
    }
}
bash
composer