tsyama記

プログラミングとそのほか

CakePHPで管理画面の作成を効率化するbakeコマンド拡張プラグインをつくった

はじめに

CakePHPで管理画面をよく作るのでbakeコマンド拡張プラグインをつくりました。

cakephp-admin-baker

tsyama/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クラスもあり、これについては公式ドキュメントにも説明があるので目を通しておくと良いです。

参考: bakeの拡張 - CakePHP3

ポイントは下記。

  • 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拡張は機会があればまた作ってみたいです。