3系ではindex_dev.phpによってIP制限を指定した上でデバッグモードを実行することができましたが、4系では標準のEC-CUBE内にindex_dev.phpが用意されておらず、環境変数や.envでAPP_ENVを書き換えないとデバッグモードを実行することができません。

これだと諸事情によりステージング環境がなかったり、本番でしか再現しない!ログ見ても原因の特定に時間がかかりそう!という時に困ったりします。

もちろん本番環境でデバッグするなという話ではあるのですが、APP_ENV = prodでもデバッグモードを実行したいときはたまにあります。そんな時のためのindex_dev.phpをご紹介します。

関連記事:[4系]デバッグモードを有効化する方法 .envファイル

このファイルをルートディレクトリに設置し、http(s)://自分のサイト/index_dev.php/ でアクセスすれば4系.envでAPP_ENV=Prodとなっていてもデバッグモードが実行できるはずです。

今作ったところなのであまり確認していません。実際に使用する際はご注意を。何か問題があれば教えていただけると嬉しいです。

特に、デバッグモードは誰でも閲覧できるとまずい情報ですのでIP制限はしっかり掛かるよう確認してください。また使用しないときは設置しないか、誰もアクセスできないようにしておいてください。

<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Dotenv\Dotenv;
use Eccube\Kernel;
use Symfony\Component\Debug\Debug;
use Symfony\Component\HttpFoundation\Request;

$autoload = __DIR__.'/vendor/autoload.php';

if (!file_exists($autoload) && !is_readable($autoload)) {
    die('Composer is not installed.');
}
require $autoload;

// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
    if (!class_exists(Dotenv::class)) {
        throw new \RuntimeException('APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" as a Composer dependency to load variables from a .env file.');
    }

    if (file_exists(__DIR__.'/.env')) {
        (new Dotenv(__DIR__))->overload();

        if (strpos(getenv('DATABASE_URL'), 'sqlite') !== false && !extension_loaded('pdo_sqlite')) {
            (new Dotenv(__DIR__, '.env.install'))->overload();
        }
    } else {
        (new Dotenv(__DIR__, '.env.install'))->overload();
    }
}

$env = 'dev';
$debug = true;
umask(0002);
Debug::enable();

$trustedProxies = isset($_SERVER['TRUSTED_PROXIES']) ? $_SERVER['TRUSTED_PROXIES'] : false;
if ($trustedProxies) {
    Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}

$trustedHosts = isset($_SERVER['TRUSTED_HOSTS']) ? $_SERVER['TRUSTED_HOSTS'] : false;
if ($trustedHosts) {
    Request::setTrustedHosts(explode(',', $trustedHosts));
}

$request = Request::createFromGlobals();

$allowedIps = [
    '自分のIPアドレス',
];

if (!in_array($request->getClientIp(), $allowedIps)) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

$kernel = new Kernel($env, $debug);
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);