CakePHP3:debugKitが表示されない…

開発環境をEC2に移したところ、debugKitが表示されないという怪現象が。 debug.logをみたところ:

2018-05-14 13:46:16 Warning: DebugKit is disabling itself as your host `ホスト名` is not in the known safe list of top-level-domains (localhost,dev,invalid,test,example,local). If you would like to force DebugKit on use the `DebugKit.forceEnable` Configure option.

本番で誤ってDebugKitがONにならないようになっているんですね。app.phpをこのように記述します:

    'DebugKit' => [
        'forceEnable' => true,
    ]

これで回避できます。

CakePHP3:tinyintとsmallintのマイグレーションファイル

bakeコマンドでマイグレーションファイルを作成すると、次のような内容が生成されます:

        $this->table('statuses')
            ->addColumn('id', 'tinyinteger', [
                'default' => null,
                'limit' => 3,
                'null' => false,
            ])
            ->addPrimaryKey(['id'])
            ->addColumn('name', 'string', [
                'default' => null,
                'limit' => 255,
                'null' => false,
            ])
            ->create();

これ、migrations migrateしても失敗するので、次のように修正する必要があります。

useの追加

マイグレーションファイルの冒頭に

use Phinx\Db\Adapter\MysqlAdapter;

と追加します

limitの置換

tinyintの場合、'limit' => 3の部分を'limit' => MysqlAdapter::INT_TINYに置き換えます。 smallintの場合はMysqlAdapter::INT_SMALLに置き換えます。

smallintegerとtinyintegerの置換

これらはintegerに置き換えます

CakePHP3:QRコードを表示する

今回は、こちらを利用しました:

github.com

PHP7.03以上とGDが必要です。

インストール

composer require chillerlan/php-qrcode

僕の場合はこれで2.0.6が入りました

GDのインストール

iusを使っているので、以下でインストール:

sudo yum install php72u-gd

呼び出し方

<?php

use chillerlan¥QRCode¥QRcode;

$data = "ほげほげ";
echo '<img src="' . (new QRCode)->render($data) . '" />';

これでOKです。

PHP:7.0から7.2に上げる

これまでPHP7.0を使っていたのですが、QRコードのライブラリが7.03以上のため、7.2にあげることにしました。 iusを使っていたので、次のようにしました:

PHP7.0の削除

yum remove php70*

PHP7.2のインストール

yum -y install php72u php72u-devel php72u-mbstring php72u-pdo php72u-intl php72u-xml php72u-json php72u-opcache php72u-cli php72u-mysqlnd mod_php72u

CakePHP3:画面が真っ白

VirtualBox仮想マシンを幾つか立ち上げてプログラムを書いていたところ、画面が真っ白であったり、 ERR_CONTENT_LENGTH_MISMATCHであったりのエラーが。

どうやらメモリ不足のようで、パソコンを再起動+仮想マシンの数を絞ったら治りました。

PHP:呼び出したいメソッドが変数に入っている場合

仮に、

$titleJa = $event->japanese[0]->title;
$titleEn = $event->english[0]->title;
$descJa = $event->japanese[0]->description;

といったことを関数にまとめたいとします:

$titleJa = getData($event, 'japanese', 'title);
$titleEn = getData($event, 'english', 'title');
$descJa = getData($event, 'japanese', 'description);

もっとエレガントな方法はあるのかもしれませんが…

function getData($event, $language, $field) {
    return ($event->$language)[0]->$field;
}

と書けばOKです。添字の[0]をそのままくっつけると動かないので、()でその前を括ってあげるのがポイントです。