2017年5月18日木曜日

CakePHP3 で Bake を拡張してみる

Index

Summary

CakePHP3 で、Bake を拡張するプラグインを作成したので、手順を残しておきます。

前提条件

プロジェクトフォルダは、$ROOT$ と表記します。

プロジェクトを作成する

まずは、composer でプロジェクトを作成します。

> composer create-project --prefer-dist cakephp/app myapp

プラグインを作成します。

$ROOT$> bin\cake bake plugin MyPlugin

GitHub に公開する場合は、GitHub のユーザ名をベンダー名とするので、わたしなら Tiichat/ をつけて、プラグインを作成します。

$ROOT$> bin\cake bake plugin Tiichat/MyPlugin

オートローダーを再作成します。

$ROOT$> composer dumpautoload

これで、下準備は完了です。

要らないものは消してしまう

どんなプラグインを作るかにも依りますが、要らないものは消してしまいましょう。ここでは、Bake を拡張するプラグインを作成するので、Shell\TaskTemplate\Bake を作成し、後は消してしまいます。

こんな感じになります。

plugins
    Tiichat
        MyPlugin
            src
                Shell
                    Task
                Template
                    Bake
            tests
                TestCase
                    Shell
                        Task

上記フォルダを作成するだけなら、手作業で作成した方が早い感じですが、 bin/cake bake plugin コマンドは、conposer.json や bootstrap.php の設定も変更してくれるので、基本は bake した方が間違いがないです。

ただし、今回は Bake を拡張するプラグインを作成するので、bootstrap.php を少し修正しておきます。

config\bootstrap.php
Plugin::load('Tiichat/Migrations', ['bootstrap' => false, 'routes' => false]);

上記は、bin/cake bake plugin コマンドが自動的に追加してくれるのですが、初期設定では 'routes' => true となっています。Bakeプラグインにルーティングは必要ないので、false としておきます。

Bake コマンドオプションを追加する

あとは、Cookbook にもある様に、こんな感じでクラスを作成します。

…\src\Shell\Task\FooTask.php
<?php
namespace Tiichat\MyPlugin\Shell\Task;

use Bake\Shell\Task\SimpleBakeTask;

class FooTask extends SimpleBakeTask
{
    public $pathFragment = 'Foo/';

    public function name()
    {
        return 'foo';
    }

    public function fileName($name)
    {
        return $name . 'Foo.php';
    }

    public function template()
    {
        return 'Tiichat/MyPlugin.foo';
    }
}

名前空間を、Tiichat\MyPlugin とします。名前空間とパッケージ階層(plugins 配下のフォルダ階層)は一致していないといけません。

テンプレートは Tiichat/MyPlugin. を付けて、プラグイン記法で記述します。こうしておくことで、 plugins\Tiichat\MyPlugin\src\Template 配下のテンプレートファイルを読み込んでくれる様になります。

ただし、Bake を拡張する場合は、Bake\Shell\Task\BakeTask で、テンプレートの配置を Template\Bake と指定しているので、そこにテンプレートを置くようにします。

では、bin\cake bake で、コマンドオプションをリストアップしてみましょう。

$ROOT$> bin\cake bake
Welcome to CakePHP v3.4.6 Console
---------------------------------------------------------------
App : src
Path: ...\MyPlugin\src\
PHP : 7.1.1
---------------------------------------------------------------
The following commands can be used to generate skeleton code for your application.

Available bake commands:
...
- foo

- foo が追加されていますね。

Migration を拡張するプラグインを作ってみる

CakePHP3の開発手順 でも述べましたが、Migration では View や Stored Procedure が手軽に扱えないので、プラグインで Bake を拡張してみました。

https://github.com/tiichat/Migrations に、ソースコードを公開しているので、ご参考までにどうぞ。。

Migration 拡張プラグインの紹介

公開したプラグインについて、簡単に紹介しておきます。
プラグインのインストール方法については、README.md に記載しています。

まず、マイグレーションファイルの作成ですが、通常の migration と同じ様に、tii_migration コマンドを叩きます。ビューの場合は、ViewBars の様に “View” を頭につける必要があります。ViewBars の場合、view_bars という名前でビューを作成します。ビューも複数形にしておかないと、bake で model など作成する際に、規約違反となってしまうので注意が必要です。

$ROOT$> bin\cake bake tii_migration ViewBars

これで、View のマイグレーションファイルと、DDL ファイルが生成されます。

\config\Migrations
        20170519014643_ViewBars.php
\config\Migrations\ddl
        view_bars_1.ddl

初回の DDL ファイル view_bars_1.ddl の中身は空なので、
作りたいビューの DDL を記述します。ただし、create view view_bars as までは、マイグレーションファイルの方に記述しているので(Drop との整合性を考えてそうしてみました・・)、DDL には、select ... から記述します。

作成したビューに変更が入るときは、再度 bake します。

$ROOT$> bin\cake bake tii_migration ViewBars

すると、

\config\Migrations
        20170519014643_ViewBars.php
        20170519015211_ViewBars.php
\config\Migrations\ddl
        view_bars_1.ddl
        view_bars_2.ddl

こんな感じになるので、view_bars_2.ddl を編集します。

マイグレーションは、普通に実行してあげればOKです。

$ROOT$> bin\cake migrations migrate

1 件のコメント:

  1. Slotty Casino - Mapyro
    Get directions, reviews 이천 출장마사지 and information for Slotty Casino 광명 출장안마 in Rohnert Park, Rohnert Park, Rohnert 당진 출장샵 Park, Rohnert Park, Rohnert Park, 아산 출장안마 Rohnert Park, Rohnert Park. 군산 출장마사지

    返信削除