Slim 4 をサブディレクトリで使用する

PHPのマイクロフレームワークであるSlimが4にバージョンアップしたのは知っていたのですが、終ぞ今まで手を出せずにいました。

ようやくドキュメントを読み始め、そこで「サブディレクトリで使用する場合はどうするのだろうか?」と思ったのでメモしておきます。

……通常はルートディレクトリだと思いますが。

検索してみると、Slimのコアメンテナーの一人であるRob Allen氏のWebサイトがヒットしました。

……本当、Slimに関することならば公式ドキュメントかこのサイトを読めば事足りてしまうのではないでしょうか。

  • URLがhttps://example.com/で、対応するルートディレクトリが/var/www/htmlとする
  • SlimのアプリケーションのURLはhttps://example.com/myappで、対応するディレクトリが/var/www/html/myappとする
  • Slim4のindex.php/var/www/html/myappにあるものとする

という条件のとき、Apacheの.htaccessとslim4の設定が以下、とのこと。

.htaccess

RewriteEngine On
RewriteBase /myapp
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

Slim 4 の設定

Slim 4 の設定としては、index.phpに以下の1行を加えるとのこと。

$app->setBasePath('/myapp');

さて、この.htaccessとSlim 4 の設定をもう少し具体的に見ていきたいと思います。

例えば、Slim-Skeletonの場合です。

Slim-Skeletonの場合、public/index.phpがアプリケーションの起点となるプログラムなので、イメージとしてはhttps://example.com/がWebサイト、https://example.com/publicがSlim 4 のアプリケーションにアクセスできるURL、という形でしょうか(これだとSlim 4 のapp/src/といったファイルやディレクトリ群がルート直下に散らばるので汚くなってしまうので、実際はもう少し工夫したいところ……)。

ただ、この例ならばpublic/.htaceessindex.phpの両方が初めからあるのでそれらを書き換えて使うことができます。

public/.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine On

  # 略

  # If the above doesn't work you might need to set the `RewriteBase` directive manually, it should be the
  # absolute physical path to the directory that contains this htaccess file.
  # RewriteBase /

#  RewriteCond %{REQUEST_FILENAME} !-f
#  RewriteRule ^ index.php [QSA,L]

  RewriteBase /public
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^ index.php [QSA,L]
</IfModule>

一番最初にRewriteEngine Onが記述されているので、</IfModule>直前の2行をコメントアウトしてサンプルのRewriteEngine Onより後の行を貼り付けます。

public/index.php

// 略

// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();
$callableResolver = $app->getCallableResolver();

$app->setBasePath('/public'); // 追加

// 略

Slim 4 の設定の方は、$appが宣言されてルーティングする前ということで、$appがインスタンス化された直後辺りが良いのではないでしょうか。

この2ヶ所を書き換えた状態でhttps://example.com/publicにアクセスして、Slim-SkeletonのHello world!が表示されればOK。

これでサブディレクトリでも使用できることが確認できました。

……ただ、困ったことにsetBasePathメソッド、Slim 4 Documentation – Slim Frameworkで検索しても出てこないのですよね……ついでに日本語の情報も見当たりませんでした。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。