Relayer
Relayer — PHP full-stack framework

Not Web MVC.Component ベースの PHP。

Relayer は Next.js の App Router に着想を得た、規約重視の PHP フルスタックフレームワークです。ディレクトリ構造がそのまま URL になり、各ルートは Controller ではなく、Element ツリーを返す Component として書きます。ルーティング・API・サーバーアクション・認証・キャッシュ・DB は、ひとつの boot エントリにまとまります。ビルドステップはありません。

$composer require polidog/relayer
Language
PHP 8.5 以上
Build
ビルドステップなし
License
MIT
Fig.01src/Pages/hello/[name]/page.psx
<?php

use Polidog\Relayer\Router\Component\PageContext;
use Polidog\UsePhp\Html\H;

return function (PageContext $ctx): Closure {
    $ctx->metadata(['title' => 'Hello']);

    return fn () => (
        <main className="p-8">
            <h1>Hello, {$ctx->params['name']}</h1>
        </main>
    );
};
GET /hello/world200 OK

このクロージャがページ Component です。置けば /hello/world が動き、ルーターへの登録も設定ファイルも要りません。

Fig.02配置 = URL
src/Pages/page.psx/
src/Pages/docs/[slug]/page.psx/docs/http-cache
src/Pages/api/search/route.php/api/search
src/Pages/sitemap.xml/route.php/sitemap.xml
src/Pages/middleware.php全ルートに適用

これはこのサイト自身の src/Pages です。ルーティング設定ファイルはありません。

Legend.psx とファイル規約
.psx
PHP に JSX をそのまま書ける拡張子。use-php が素の PHP へコンパイルするので、テンプレート言語も Node のビルドも挟みません。
page.psx / route.php
page.psx があればページ、route.php があれば JSON を返す API。同じディレクトリに両方は置けません。
[slug]
角括弧のディレクトリが動的セグメント。値は $ctx->params['slug'] で受け取ります。
Fig.03リクエストの通り道

1 リクエストが通るのはこの 4 か所だけです。ミドルウェアで共通処理、ページで描画、キャッシュヘッダーを付けて、ドキュメントとして書き出す。

GET /docs/http-cache
  1. src/Pages/middleware.phpロケール解決と共通ヘッダー
  2. src/Pages/docs/[slug]/page.psxPSX を Element ツリーへ
  3. $ctx->cache(…)ETag と s-maxage を付与
  4. HtmlDocumenthead を組み立てて描画
200 OK — text/html
Colophonこのサイト
Runtime
FrankenPHP シングルバイナリ / PHP 8.5
Image
192 MB・コールドスタート 700 ms
Content
Turso (libSQL) — 本文の唯一の正
Edge
Fly.io nrt + Cloudflare キャッシュ

このドキュメントサイト自体が Relayer で書かれています。ソースは公開しています。 github.com/polidog/relayer-docs

規約を覚えるより、1 ページ書くほうが早い。