ルーティング
TubePress Router API について解説します。フロントエンド、管理画面、API のルートがどのように登録・マッチング・ディスパッチされるか、ルートパラメーターや HTTP メソッドも含めて説明します。
TubePress は静的な Router クラスを中心に構築された、小型で高速なルーターを使用しています。コントローラーは ::routes() メソッドでルートを登録し、public/index.php がリクエストをディスパッチする前にそれらのメソッドを呼び出します。このページでは、プラグインからルートを追加する方法や、リクエストがどのようにマッチングされるかを理解するために必要なすべてを解説します。
ルートの登録
Router::get() または Router::post() でルートを登録します。ハンドラはクロージャや [Class, 'method'] のペアなど、任意の呼び出し可能なものを指定できます。
// Closure handler
Router::get('/promo', function () {
ThemeRenderer::render('promo', ['deal' => 'Summer']);
});
// Controller handler
Router::post('/promo/claim', [PromoController::class, 'claim']);慣例として、各コントローラーはすべてのルートを登録する静的な routes() メソッドを公開し、そのメソッドは起動時に一度だけ呼び出されます。
class PromoController
{
public static function routes(): void
{
Router::get('/promo', [self::class, 'show']);
Router::post('/promo/claim', [self::class, 'claim']);
}
}ルートパラメータ
パス内に {name} プレースホルダーを使用します。各プレースホルダーは単一の URL セグメント(/ 以外のすべて)にマッチします。値は Router::param() で読み取ります。
Router::get('/promo/{code}', function () {
$code = Router::param('code'); // required
$ref = Router::param('ref', 'direct'); // with a default
// …
});内部では、/promo/{code} のようなパターンは正規表現 (?P<code>[^/]+) にコンパイルされるため、パラメータはスラッシュをまたぐことはありません。完全一致のルートが最初にマッチされ、次にパラメータ付きのルートが登録順にマッチされます。
レスポンスの送信
| メソッド | 用途 |
|---|---|
ThemeRenderer::render($tpl, $data) | アクティブなテーマを通じてフロントエンドページをレンダリングします。 |
Router::render($tpl, $data) | 管理テンプレート(templates/{$tpl}.php)をレンダリングします。 |
Router::json($data, $code = 200) | JSON レスポンスを送信して終了します。 |
Router::redirect($url) | リダイレクト(して終了)します。フロントエンド URL はアクティブな言語/タイプで自動的にプレフィックスされます。 |
ルートの順序とキャッチオール
静的ページは /{slug} キャッチオールによって提供されるため、ページコントローラーは他のすべてのフロントエンド、管理、API ルートの後に public/index.php で最後に登録されます。起動中にプラグインからルートを登録した場合、それらはキャッチオールの前に追加され、最初にマッチされます。
/deals のようなプラグインルートは、/deals の静的ページを上書きします。安全のため、プラグインルートには名前空間を付けてください(例:/promo/deals)。CSRF 保護
状態を変更するすべての POST は CSRF 保護が必要です。ルーターは以下のヘルパーを提供しています。
// In your form template
<?= Router::csrfField() ?> // hidden input
// In your POST handler
if (!Router::verifyCsrf()) {
Router::json(['error' => 'Invalid token'], 403);
}verifyCsrf() は csrf_token POST フィールドまたは X-CSRF-Token ヘッダーからトークンを受け取り、hash_equals() で比較します。
ローカライズされた URL と型付き URL
多言語サイトでは、ルーターは言語プレフィックス(例:/fr/…)を透過的に処理し、既知のルートスラッグを翻訳します。例えば /categorie/brunette は category ルートに解決されます。管理ルートとインストールルートは除外されています。カスタムパスをプレフィックス付けから除外する必要がある場合は、Router::addNoPrefixPath() でパスを登録してください。完全な動作については 言語と翻訳 を参照してください。ヘルパー Router::langPrefix()、Router::typePrefix()、Router::url() を使用すると、任意のロケールで正しいリンクを構築できます。