socket.io-php-emitter 0.7.0が動作しない問題

2016年09月16日時点で rase/socket.io-php-emitter 0.7.0 は2年ほどメンテナンスされておらず、互換性の問題があり emit しても動作しません。

Redis のチャンネル名と msgpack のフォーマットが変更されたことが原因のようです。

socket.io-redis 1.0.0以上を使う場合は、有志の方が作成した ashiina/socket.io-emitter の0.8.0以上を使いましょう。
尚、socket.io-redis 0.2.0 は手元で試していないので分かりません。

修正内容

composer.json (php)

{
    "name": "sample-client",
    "type": "project",
    "require": {
        "ashiina/socket.io-emitter": "^0.8.0"
    }
}
  • 修正前: "rase/socket.io-emitter": "^0.7.0"
  • 修正後: "ashiina/socket.io-emitter": "^0.8.0"

package.js (nodejs)

{
  "name": "sample-server",
  "main": "index.js",
  "dependencies": {
    "express": "^4.10.2",
    "socket.io": "^1.4.8",
    "socket.io-redis": "^1.0.0"
  }
}

参考情報

CakePHP3のMigrationsでDB接続先を切り替える方法

CakePHP3 の Migrations コマンドを使ってマイグレーションする際、DB 接続先を明示的に指定することが出来ます。

この記事の内容は、以下のように CakePHP の設定ファイルに複数の Datasource が設定されていることが前提になります。

config/app.php:

    /**
     * Connection information used by the ORM to connect
     * to your application's datastores.
     * Do not use periods in database name - it may lead to error.
     * See https://github.com/cakephp/cakephp/issues/6471 for details.
     * Drivers include Mysql Postgres Sqlite Sqlserver
     * See vendor\cakephp\cakephp\src\Database\Driver for complete list
     */
    'Datasources' => [
        'default' => [
            // 省略
        ],
        'my_other_connection' => [
            // 省略
        ]
    ],

Datasource を指定するオプション

例えば config/app.php で設定した my_other_connection の Datasource に接続する場合、以下のように -c オプションにデータソース名を指定します。

./bin/cake migrations migrate -c my_other_connection

また、以下のように接続先を指定しないとデフォルトの Datasource が使用されます。

./bin/cake migrations migrate

ただし、この方法は全てのマイグレーションファイルで指定した接続先が使用されます。マイグレーションファイルごとに接続先を切り替えたい場合は以下を参照してください。

マイグレーションファイルごとに接続先を切り替える方法

少しアナログな方法にはなりますが、少し手を加えることで実現できます。

まず、以下のように接続先ごとにフォルダを分けて、その中にマイグレーションファイルを入れておきます。

  • config/Migrations/default (default コネクション用フォルダ)
  • config/Migrations/other (my_other_connection コネクション用フォルダ)

この状態でマイグレーションをするときに -s (–source=SOURCE) オプションで上記のディレクトリを指定してマイグレーションします。

./bin/cake migrations migrate -c default -s Migrations/default

./bin/cake migrations migrate -c my_other_connection -s Migrations/other

マイグレーションの実行履歴はコネクションごとの phinxlog テーブル上で管理されるため、バッティングせずにマイグレーション出来ます。

コマンドオプション指定の組み合わせは間違えないよう注意する必要があります。

CakePHP3のBakeコマンドで生成されるファイルをカスタマイズする

TL;DR

CakePHP3 の bake コマンドで生成されるファイルの内容をカスタマイズしたい場合、対応するテンプレートファイルを src 以下にコピーして追加して内容を書き換えるだけでカスタマイズできます。

Model ファイルを bake する例

まずは通常通り Model 関連ファイルを作成するコマンドです。
テーブル名が users の場合は以下のようなコマンドを実行すると焼き上がります。

bin/cake bake model Users

実行すると以下4ファイルが生成されます。

  • src/Model/Table/UsersTable.php (Table)
  • src/Model/Entity/User.php (Entity)
  • tests/Fixture/UsersFixture.php (Fixture)
  • tests/TestCase/Model/Table/UsersTableTest.php (TestCase)

生成されるファイルの内容を一部カスタマイズする方法

上記のコマンドで生成されるファイルのコード内容を一部書き換えたい場合どうすればいいでしょうか?
例えば Table クラスファイルの内容を書き換えたい場合、以下の手順で出来ます。

  1. vendor/cakephp/bake/src/Template/Bake/Model/table.ctp にあるファイルをコピーする(通常はこのファイルを元に生成が行われる)
  2. コピーしたファイルを src/Template/Bake/Model/table.ctp に貼り付ける
  3. 貼り付けたファイルの内容の書き換えたい箇所を書き換える

この状態で bake コマンドを実行するとコピーした ctp ファイルを元にクラスファイルの生成が行われます。
Entity クラスや Controller クラスなどを書き換えたい場合も同様の方法で可能です。

ctp ファイルの書き方やその他詳しい情報は CakePHP 公式ドキュメントの Extending Bake — CakePHP Cookbook 3.x documentation を参照してください。

更にカスタマイズをしたい場合

更なるカスタマイズをしたい場合、ここでは詳しく説明しませんが bake 用の Theme Plugin を作成してそれを bake 時に有効にして適用する方法や、新しい bake コマンドオプションを作ってしまう方法などがあります。

例えば Bake\Shell\Task\SimpleBakeTask クラスを継承して FooBakeTask クラスを作成することで、以下のようなコマンドを実行できるようになります。

bin/cake bake foo

やろうと思えば専用のコマンドラインオプションの追加実装なども出来るため、かなり自由度の高いカスタマイズが出来そうです。