Posted at

GAE/SE PHP7.2環境で旧来のようなマルチコントローラを実現する

GAE/SE PHP 7.2環境では5.5環境とapp.yamlの書き方が変わっており、フロントコントローラ構成が前提になっています(参照:「GAE/SE PHP 5.5環境と7.2環境のapp.yamlの違い - Qiita」)。

しかし、置いたPHPファイルをそのまま実行したいんだ!ということもあるのではないでしょうか。そうした状況のための設定例を紹介します。

.

├── app.yaml
├── index.php
├── php
│   └── *.php
└── static
├── css
│   └── *.css
└── js
└── *.js


app.yaml

runtime: php72

entrypoint: serve index.php

handlers:
- url: /js
static_dir: static/js
- url: /css
static_dir: static/css
- url: /
script: auto
- url: /.*\.php
script: auto



index.php

<?php

$path = @parse_url($_SERVER['REQUEST_URI'])['path'];
if ($path === '/') {
$path = 'index.php';
}
$path = sprintf("%s/php/%s", __DIR__, $path);
if (file_exists($path) && is_file($path)) {
require $path;
} else {
http_response_code(404);
}

上記のディレクトリ構成とファイル内容にした上で、/foo.phpにアクセスすると./php/foo.phpが、/bar.phpにアクセスすると./php/bar.phpがそれぞれ実行されます。

ダミーのフロントコントローラを置いて実体ファイルをrequireしているだけなんですが、以前と流儀が変わって悩む人もいるかと思ったので記事にしておきます。