勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでルーティング用ライブラリ「AltoRouter」の利用方法

  PHP

PHPフレームワークのCodeIgniterを勉強していた際にルーティング機能が便利だなと思った。これをフレームワーク無しの状態でも使えないかと思って調べたところ「AltoRouter」がシンプルで良さそう。「AltoRouter」を使用してhello worldページの表示とパラメータ付きのルーティング方法をメモ。

 

AltoRouter

公式サイト

https://github.com/dannyvankooten/AltoRouter

リファレンス

https://dannyvankooten.github.io/AltoRouter/

特長

  • composer無しでも導入可
  • ファイル1枚で動作する
  • インストール要件はPHP5.3以上(8.3系で動作確認済み)
  • そこそこ更新が活発(2024/03時点で最終更新が約半年前)
  • 日本語での情報が少なめ

 

インストール

composerを利用する場合

サーバにSSH接続し以下コマンドでインストールする。

composer require altorouter/altorouter

composerを利用しない場合

以下からzipファイルをダウンロードし、展開した上でAltoRouter.phpを適当なディレクトリにアップロードする。

https://github.com/dannyvankooten/AltoRouter/zipball/master

尚、今回はこちらの方法を取った。

 

ディレクトリ構成

root/
 ├lib/
 │└AltoRouter.php(ライブラリ)
 ├public/
 │├hello.php
 │├item.php
 │└user.php
 ├.htaccess
 └index.php

 

ソースコード

.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

index.php

<?php
include './lib/AltoRouter.php';

$router = new AltoRouter();

//ベースパス指定(ドキュメントルート以外の場合に指定)
$router->setBasePath('/aaa/bbb');

//hello worldページ(TOPページ)
$router->map( 'GET', '/', function() {
    include __DIR__ . '/public/hello.php';
});

//ユーザーページ
$router->map( 'GET', '/user/[i:user_id]/', function( $user_id ) {
    require __DIR__ . '/public/user.php';
});

//商品ページ
$router->map( 'GET', '/item/[*:item_code]/', function( $item_code ) {
    require __DIR__ . '/public/item.php';
});

$match = $router->match();

if( $match && is_callable( $match['target'] ) ) {
    call_user_func_array( $match['target'], $match['params'] );
}else{
    //エラー処理(404リダイレクト)
    echo 'エラーが発生しました。';
}

/public/hello.php

<?php
echo 'hello world';

/public/item.php

<?php
if( isset($item_code) ){
    echo 'item_codeは' . $item_code . 'です。';
}else{
    echo 'item_codeが指定されていません。';
}

/public/user.php

<?php
if( isset($user_id) ){
    echo 'idは' . $user_id . 'です。';
}else{
    echo 'idが指定されていません。';
}

 

解説等

ベースパス指定

ドキュメントルート以外で使用したい場合に以下ベースパス指定をする必要がある(指定しないと動かない)。

$router->setBasePath('/aaa/bbb');

mapの第1引数

以下から選択できる模様。

  • GET
  • POST
  • PATCH
  • PUT
  • DELETE

HTTPメソッドについてはこちらのページが分かりやすい。

mapの第2引数

アクセス時のディレクトリ名を指定する。「https://test.com/設置ディレクトリ/home」の場合は「/home」を指定する。

また、パラメータを付与したい場合[一致タイプ:変数名]で指定する。一致タイプについては以下から選択できる模様。

  • 'i' => '[0-9]++'
  • 'a' => '[0-9A-Za-z]++'
  • 'h' => '[0-9A-Fa-f]++'
  • '*' => '.+?'
  • '**' => '.++'
  • '' => '[^/\.]++'

半角数値のみの「i」、半角英数のみの「a」、何でもありの「*」あたりがよく使いそう。

 

所感

composer無しでも導入可&ファイル1枚で動作という好きなパターンなので今後使っていきたい。

尚、もっと高機能なものを使いたい場合はFastRouteが良いらしい。

 - PHP

  関連記事

PHPでvar_dumpをツールバー形式で表示するライブラリ「Kint」の使い方

PHPでvar_dumpを見やすくするためにdBugライブラリを利用しているが、 ...

HTML / CSSで作成したコンテンツをPDFファイルで出力する方法(TCPDF)

HTML / CSSで作成したコンテンツをPDFファイルで出力させたい。以前mp ...

PHPでエラーメッセージを見やすくするwhoopsの利用方法

PHPのエラーメッセージが見づらい。これはこういうもの、と諦めていたがCodei ...

PHPで「ramsey/uuid」ライブラリを用いてUUIDを生成する方法

PHPでUUID(Universally Unique Identifier)を ...

Composer無し&ファイル1枚でPHPのエラーメッセージ画面をリッチにするライブラリ「PHP Error」の利用方法

先日PHPのエラーメッセージを見やすくするwhoopsの利用方法をメモしたが導入 ...