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