コンテンツにスキップ
Nibiru docsv0.9.2

ルーティング

NibiruがURLをコントローラー、アクション、パラメーターにマッピングする方法——SEOフレンドリーなURL形式も含む。

Stable Reading time ~ 1 min Edit on GitHub

Nibiruのルーティングは規約に基づくもので、特殊なケースのためにsettings.<env>.iniからオプションで正規表現を使用したルートを設定できます。大きなルートファイルを維持する必要はありません。

/<controller>/<action>/<param1>/<param2>/...

例:

URLコントローラーアクション$_REQUEST
/indexController(なし)
/productsproductsController(なし)
/products/detailproductsControllerdetailAction
/products/detail/42productsControllerdetailActionid => 42
/users/edit/42usersControllereditActionid => 42

_action がない場合、のみ navigationAction()pageAction() が実行されます。_action がある場合、指定されたアクションがその間に実行されます。

Nibiru は、どの設定も不要で SEO フレンドリーな URL を自動検出します。パターン:

/<controller>/<slug>/<numeric-id>

もし2番目のセグメントがコントローラーのメソッド名でない場合、3番目のセグメントが数値である場合、Nibiruは内部的にリクエストを書き換えます。

/<controller>/detail/?id=<numeric-id>&slug=<slug>

したがって、URL /maschine/marduk-gold-plating/42maschineController::detailAction() に到達し、$_REQUEST['id'] === '42' かつ $_REQUEST['slug'] === 'marduk-gold-plating' となります。これは、プロダクション E-コマースサイト prod.maschinen-stockert.de がカスタムルーターなしでクリーンな URL を生成するのと同じ方法です。

アクションセグメント以降は、位置によってペアリングされた $_REQUEST キーになります。

// /users/edit/42 → $_REQUEST['id'] = '42'
public function editAction() {
$id = (int) ($_REQUEST['id'] ?? 0);
/ ...
}

数値的または名前付きパラメータ以外の場合、クエリ文字列を使用することをお勧めします。

/users/search?q=marduk&page=2

カスタムルートをINIで設定する

Section titled “カスタムルートをINIで設定する”

[NIBIRU_ROUTING] セクションは、settings.<env>.ini で正規表現の URL パターンをコントローラー/アクションのペアと名前付きパラメータにマッピングできます。

[NIBIRU_ROUTING]
; Map /api/v1/products/42 to apiController::productsAction with id=42
api.v1.products.pattern = "^/api/v1/products/(\d+)$"
api.v1.products.controller = "api"
api.v1.products.action = "products"
api.v1.products.params[] = "id"

パターンに一致するURLの場合、キャプチャーグループは順番に名前付きの params[] キー($_REQUEST エントリ)に割り当てられます。

Router::getInstance()->currentPage(); / 'products'
Router::getInstance()->tplName(); / 'products' (controller stem for templates)
Router::getInstance()->getController(); / alias for currentPage()

これらはコントローラーとテンプレート内で役立ちます:

<a href="/products" class="{if Router::currentPage() == 'products'}active{/if}">
Products
</a>

(Smartyでは、Smartyプラグインまたは事前に割り当てられた変数を使用します;ヘルパー自体はPHP用です。)

フレームワークレベルでリダイレクトする(適切なHTTPヘッダーを設定し、終了する):

View::forwardTo('/login');

JSON レスポンスの場合 (Content-Type: application/json を設定します):

View::forwardToJsonHeader();
View::assign(['data' => ['ok' => true]]);

このパターンは、プロダクションのAPIエンドポイントで重く使用されています — data.maschinen-stockert.deapiController をご覧ください。

Nibiruのpaginationは、次の形式のURLを期待しています:

/<controller>/<action>/page/<N>

Pageination クラスは、末尾の page/N 段階を解析するため、それを保持する任意のルート形式で構いません。

末尾のスラッシュと大文字小文字

Section titled “末尾のスラッシュと大文字小文字”

URLは大文字小文字を区別してマッチされます。/Users/edit/users/editは異なるコントローラーにヒットします(後者は存在し、前者は404エラーになります)。末尾のスラッシュは許容されます。

  • アクションとSEO URLの衝突。 メソッドを aboutAction() に名付け、/products/about/42 をSEO URLとして使用しようとすると、SEOリライトは トリガーされません 。なぜなら、about が既知のアクションであるためです。アクション名と衝突しないスラッグを選択してください。
  • _action のないアクション。 /products/detail/ だけを入力しても detailAction() を呼び出しません — _action は必須です。URLに少なくとも2つのセグメントがある場合、ディスパッチャーは自動的にこれを行いますが、クエリ文字列が削除された場合は行われません。
  • index はルートコントローラーです。 /indexController 。別途の “ホーム” ルートはありません。