CakePHP4 において、多次元配列をログファイルに出力する方法

CakePHP

CakePHP にはデバッグに関する多くの機能が備わっています。AJAXやREST APIの技術を利用していると、その結果は直接画面に出力するものではないため、ロギングの機能が重要になってきます。

ロギング

このロギングの機能は CakePHP のバージョンアップとともに優れたものになっていますが、 CakePHP4 になった際ちょっとした工夫が必要になったため、ここではそれを紹介したいと思います。

CakePHP3 までのロギング

CakePHP3 までは配列を log 関数で簡単に出力することができました。

$data = [
    [
        'id'    => 1,
        'name' => 'hoge',
        'option' => [
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3',
        ],
    ], [
        'id'    => 2,
        'name' => 'fuga',
        'option' => [
            'key1' => 'value4',
            'key2' => 'value5',
            'key3' => 'value6',
        ],
    ]
];
$this->log($data);
2021-01-11 00:00:00 Error: Array
(
    [0] => Array
        (
            [id] => 1
            [name] => hoge
            [option] => Array
                (
                    [key1] => value1
                    [key2] => value2
                    [key3] => value3
                )

        )

    [1] => Array
        (
            [id] => 2
            [name] => fuga
            [option] => Array
                (
                    [key1] => value4
                    [key2] => value5
                    [key3] => value6
                )

        )

) 

CakePHP4 のロギング

しかし、CakePHP4 ではこの log 関数の仕様が変わってしまい、引数に配列を渡すと次のようなエラーが発生します。

Error: [TypeError] Argument 1 passed to Cake\Controller\Controller::log() must be of the type string, array given, called in C:\xxx\yyy.php

エラーメッセージにあるように引数は文字列型でなければいけなくなってしまいました。
そのため、配列を文字列に変換する必要があります。 ただし、単純な配列ばかりではありません。例えば CakePHP でデータベースを検索し、その結果を受け取ると2次元配列になっていることもあります。そのほか、多次元配列の内容を確認したいこともあるでしょう。
PHP には、 serialize 関数や json_encode 関数など、配列を文字列に変換する機能が多く備わっていますが、これらは1行の文字列に変換されるため、お世辞にも見やすいとは言えません。デバッグ上、見やすくなければ開発効率が悪くなるだけです。

では多次元配列をデバッグしやすい形で出力するには、どの関数がいいのでしょうか。私なりの答えは var_export 関数です。ただ単純に var_export 関数を使ってしまうと、画面に出力するためのものになってしまうため、第2引数を true とし値を返すようにする必要があります。

$data = [
    [
        'id'    => 1,
        'name' => 'hoge',
        'option' => [
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3',
        ],
    ], [
        'id'    => 2,
        'name' => 'fuga',
        'option' => [
            'key1' => 'value4',
            'key2' => 'value5',
            'key3' => 'value6',
        ],
    ]
];
$this->log(var_export($data, true));
2021-01-11 00:00:00 Error: array (
  0 => 
  array (
    'id' => 1,
    'name' => 'hoge',
    'option' => 
    array (
      'key1' => 'value1',
      'key2' => 'value2',
      'key3' => 'value3',
    ),
  ),
  1 => 
  array (
    'id' => 2,
    'name' => 'fuga',
    'option' => 
    array (
      'key1' => 'value4',
      'key2' => 'value5',
      'key3' => 'value6',
    ),
  ),
) 

まとめ

今回は CakePHP4 における多次元配列のログファイルへの出力方法を紹介しました。
判ってしまえば簡単なことですが、CakePHP3 まで普通にできていたことが CakePHP4 ではエラーになり一瞬焦ってしまったので、皆さんが同じ轍を踏まないようにと情報共有させて頂きました。