CakePHPで管理画面の作成を効率化するbakeコマンド拡張プラグインをつくった
はじめに
CakePHPで管理画面をよく作るのでbakeコマンド拡張プラグインをつくりました。
cakephp-admin-baker
GithubとPackagistに公開してあるので、composerでインストールできます。
使い方
composerでのインストール
composer require tsyama/cakephp-admin-baker --dev
bakeで新しいファイルを作るだけのプラグインなので、本番環境には必要ありません。require-devに登録しましょう。
bootstrap.phpへのプラグイン登録
Plugin::load('AdminBaker', ['bootstrap' => false, 'routes' => true]);
bootstrap.phpでプラグインのロードを記述します。ファイルの末尾に追加する形でいいと思います。
bake admin_bakerコマンドの実行
bin/cake bake admin_baker Test --theme AdminBaker
bakeコマンドが追加されるので実行します。Test
部分は生成されるテンプレートファイルの一部に使用されるだけなので深く考えなくてもよいです。プロジェクト名などを入力しましょう。
コマンドを実行すると下記ファイルが作成されます。
- src/Controller/AdminBakerController.php
- src/Template/Element/AdminBaker/header.ctp
- src/Template/Element/AdminBaker/sidebar.ctp
- src/Template/Layout/admin_baker.ctp
- src/View/AdminBakerView.php
AdminBakerControllerクラスを継承したControllerを作成
use App\Controller\AdminBakerController; class TestController extends AdminBakerController { ... }
AdminBakerControllerクラスを継承したクラスを作成すると専用のViewおよびLayoutを使用したページを作成することができます。TemplateはAdminLTEを使用しており、AminBakerViewで必要なCSSやJSファイルがCDN経由で呼び出されています。
解説
bakeの拡張プラグインの作り方が思ったよりも取り扱いやすく、いろいろ応用が効きそうなので、簡単にプラグインの作成手順を書き記しておきます。
プラグインの作成
CakePHPではbakeコマンドでプラグインを作成することができます。
bin/cake bake plugin AdminBaker
これでplugins以下にAdminBakerディレクトリが作成されます。この中に管理画面作成補助機能を作っていきます。
なお、AdminBaker以下をGit管理とすることでCakePHPプラグインとして公開することもできます。公開したプラグインはPackagistに登録し、composer install
でplugins以下にあるのと同様に動作します。
参考: プラグイン(CakePHP公式)
bakeコマンドオプションの作成
このプラグインの中でbakeの独自コマンドオプションを定義します。bake admin_baker
コマンドを作るために、plugin/AdminBaker/src/Shell/Task/AdminBakerTask.php
を作成します。
<?php namespace AdminBaker\Shell\Task; use Cake\Console\Shell; use Cake\Core\Configure; use Bake\Shell\Task\BakeTask; class AdminBakerTask extends BakeTask { public $pathFragment = 'Template/Layout/'; public $tasks = [ 'Bake.BakeTemplate', ]; public function main($name = null) { parent::main(); $this->bake(); } public function bake() { $this->out("\n" . "Baking admin-baker files...", 1, Shell::QUIET); $out = $this->bakeLayout(); return $out; } public function bakeLayout() { $contents = $this->BakeTemplate->generate('AdminBaker.Template/Layout/layout'); $path = $this->getPath(); $filename = $path . 'admin_baker.ctp'; $this->createFile($filename, $contents); return $contents; } }
わかりやすいように、Layoutファイルを作成する処理のみ抜き出しました。完成版はGithubから確認してください。
bakeコマンドを作成する際はBakeTaskクラスを継承して作成します。より簡単に作成ができるSimpleBakeTaskクラスもあり、これについては公式ドキュメントにも説明があるので目を通しておくと良いです。
ポイントは下記。
- pathFragmentプロパティにbakeされるファイルのパスを設定しておく
- bakeを実行すると、はじめにmain()メソッドの処理が行われる
- tasksプロパティに
Bake.BakeTemplate
を持たせると$this->BakeTemplate
がセットされ、generate()メソッドを実行することでtwigテンプレートをもとにcontentsを作成する - createFile()メソッドでファイルを出力する
また、処理中で使用するbakeテンプレートファイルはplugin内にtwig形式で作成しておきます。
plugins/AdminBaker/src/Template/Bake/Template/Layout/layout.twig
<!DOCTYPE html> <html> <head> <?= $this->Html->charset() ?> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="robots" content="noindex"> <title>AdminBaker</title> <?= $this->Html->meta('icon') ?> <?= $this->fetch('meta') ?> <?= $this->fetch('css') ?> <?= $this->fetch('script') ?> </head> <body class="skin-blue"> <div class="wrapper"> <?= $this->element('AdminBaker/header') ?> <?= $this->element('AdminBaker/sidebar') ?> <div class="content-wrapper"> <?php echo $this->Flash->render(); ?> <?= $this->fetch('content') ?> </div> </div> </body> </html>
おわりに
ただでさえ便利なbakeコマンドですが、自分好みにカスタマイズしたり機能追加できると楽しそうですね。bake拡張は機会があればまた作ってみたいです。