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

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

CakePHP3で現在のパスやURLを取得する

過去にCakePHP2でのURL取得方法をメモしましたが、CakePHP3では取得方法が変更されていましたのでメモしておきます。

View クラス(テンプレート上)で取得する場合

今までは HtmlHelper で取得していましたが、CakePHP3 では UrlHelper で取得できます。

// 絶対パスとして取得 (/controller/action/)
<?= $this->Url->build('/controller/action/') ?>

// フル URL として取得 (http://example.com/controller/action/)
<?= $this->Url->build('/controller/action/', true) ?>

通常は絶対パスで取得され、第二引数を true にすると URL として取得されます。

View 以外のクラスで取得する場合

Router クラスを使用しますが、use 句で使用することを宣言しておく必要があります。
UrlHelper::build() も最終的には同じメソッドが呼び出されるので引数の仕様は同じです。

use Cake\Routing\Router;

class HogeController extends AppController {
    public function index() {
        // フル URL として取得
        // (http://example.com/controller/action/)
        $path = Router::url('/controller/action/', true);
    }
}

至高のクラウドメモ環境を求めて

メモ環境に求めているもの

メモ環境に対して求めているものを整理して見なおしてみました。
同じようなことを求めている人はこの記事を読むと幸せになれるかもしれません。

  1. プレーンテキストでメモできること
    • リッチテキスト的なテキスト装飾は不要
  2. Markdown をサポートしていること
    • Markdown の入力補助
    • Markdown のプレビュー
  3. コードブロックのシンタックスハイライトに対応していること
  4. タイトルや本文で全文検索できること
  5. 保存した時点でクラウド環境に同期されること
  6. 特定のツールに依存せず、任意のツールでメモにアクセスできること
  7. メモにタグ付けできること
  8. 複数のデバイス環境でメモを閲覧・編集できること
    • Mac (メイン)
    • iPhone (サブ)
    • Windows (サブ)

今までのメモ環境

Evernote のみ

おなじみ、圧倒的に支持されているクラウドメモサービスです。

使っていて便利だなあと思いつつも、漫然とした不満を持ちながら使っていました。こうしてメモ環境に求めているものを並べてみると、多くのニーズを満たしていないことが分かりますね…。

エンジニアにとってプレーンテキスト前提の設計思想ではないこととコードブロックに対応していないことは辛いものがあるのではないでしょうか。

Evernote というぬるま湯便利環境に浸っていてはいけないとメモ環境の改革を決意しました。

新しいメモ環境

Dropbox + nvALT + MacDown + Nebulous Lite

新しいメモ環境は最終的にこのような組み合わせになりました。

メモ環境

nvALT は高速な全文テキスト検索を備えたシンプルなテキストエディタで、MacDown は賢いシンタックスハイライトを備えた Mou ライクなマークダウンエディタです。

MacDown

メモの検索やちょっとしたメモは nvALT で行い、がっつり文章を書くときやプレビューしたい時は MacDown で開くようなイメージです。

あとはメモの保存先を Dropbox にしておけば他のデバイスと同期できます。ファイルベースで保存されるので好きなツールでメモファイルにアクセスできます。

iPhone アプリは Nebulous Lite をいれてみました。全てのメモをファイル名で検索でき、一応マークダウンのプレビュー表示にも対応しています。

各ツールのいいとこ取りのような環境で、求めていた環境に近い環境ができあがりました。

nvALT の検索タグについての懸念

この環境の若干の不安要素は nvALT のタグが OpenMeta というあまり先行きが明るくないとされる規格で保存されることでしょうか。OpenMeta タグは Nebulous Lite では検索できません。

なので、ファイル名にタグ情報を含めてしまう感じで運用してみようと思っています。例えば以下のような感じで。

  • ログファイルのフィルタリング方法[bash][log][tips].md
  • ○○○○の基本設計検討MTG[design][minutes].md

…なんだかこういう基本的な仕組みを組み合わせて頑張る運用、昔 ChangeLog + Chalow + 秀丸でメモしてた頃を思い出して、少し複雑な気持ちになってしまいます。

各ツールの設定方法メモ

nvALT の設定

Preference > Notes

nvALT設定1

  • Read notes flom folder を Dropbox 上の任意フォルダに変更
  • Storage タブ
    • Plain Text Files に変更
    • 拡張子に md を追加しチェックアイコンでデフォルトに変更

Preference > Editing

nvALT設定2

  • External Text Editor を MacDown.app に変更

これで設定で開いているメモを MacDown で開けるようになります。ショートカットキーの Command + Shift + E で開くのが一番楽だと思います。

MacDown の設定

Preference > Rendering

  • Syntax highlighting in code blocks にチェック

その他、お好みで。

他に検討したメモ環境達

1. Simplenote

Simplenoteはシンプルで軽快なクラウドメモサービスで、必要最小限の機能を備えます。
かなり良さげですが Markdown のサポートが弱いため今回は見送りました。

2. Kobito

Mac のマークダウンメモアプリです。UI 構成は Evernote ライクで、Qiita にそのまま投稿もできます。

簡単かつ便利なので非常に迷いましたが、メモデータが DB に保存されるため他のツールと連携しにくいことと iOS アプリが無かったので見送りました。

3. Dropbox + Sublime Editor

Sublime に Markdown 系の拡張をいれ、Dropbox の共有フォルダをプロジェクトとして開いておくとそこそこ便利な環境が出来上がります。

今回は至高を求めていたため見送りました。

まとめ

現状で至高と思えるメモ環境ができました。ブログ名にも「メモ帳」と入ってたりするのですが、メモに関してはこれからも向き合っていくようにしたいなと思っています。

メモしていて Markdown ってやっぱり手軽に便利で素晴らしいなと思いますし、対応ツールも増えてきて嬉しい限りですが、まだまだ非エンジニアへの認知度が低い気がするのでもっと広がって欲しいなと願っています。まずは Qiita:Team に日報書く文化を社内に根付かせるところあたりから始めて見るのがいいかもしれませんw

他におすすめのツールなどあればコメントお待ちしています。