Laravel4、ジェネレーターパッケージ

タグ: Laravel4  

個人的にはコマンドラインからのジェネレーターは余り使用しません。私の好みは、エディターやIDEを調整して、生成できるように設定する方法です。もしくは、yiiのように、GUIでもコード生成機能を作成してくれる方が好みです。

Laravel自身が持っている、コード生成機能はartisan migrate:makeにより、マイグレーションファイルを生成してくれる機能と、コントローラーの生成だけです。CakePHPやRoR、CIやyiiなど、多くの他のフレームワークが持っているような生成機能はデフォルトでは用意されていません。

Laravel3の時より、Jeffrey Way氏はコードジェネレーターを提供しています。Laravel4でも、彼のパッケージは人気があります。(composer.jsonにタブが指定されていないため、検索で引っかかりづらいです。例えばPackagistで、'laravel generator'と検索しても見つかりません。`way generator'とか、'laravel generators'で検索すれば、見つかります。Issueとして投げておいたので、そのうち追加されるかも知れません。)

今回は、これを紹介しましょう。CakeやRoRのように、コード生成がコマンドラインから可能になります。

インストール

標準的なLaravel4のパッケージのインストール手順です。Composerからインストールします。

まず、composer.jsonの"require"セクションに、"way/generators": "dev-master"をついかし、compser updateを実行してください。インストールされます。

続いて、このパッケージを有効にするため、app/config/app.phpをエディターで開き、サービスプロバイダーに、以下の一文を追加します。

'Way\Generators\GeneratorsServiceProvider',

これで、使用できます。php artisanを実行すると表示されるコマンド一覧に、generateコマンドとして多くのサブコマンドが、追加されています。

元ファイル

このパッケージでは、vendor/way/generators/src/Way/Generators/Generators/templatesフォルダー下に、生成する元ファイルが設置されています。それを変更すれば、生成される結果を変更することが可能です。ただ、パッケージにアップデートがかかる場合、更新されなかったり、もしくは上書きされる可能性があります。(多分、現在のバージョンでは上書きされると思いますが、composerは動作が頻繁に変更されるため、正確に把握していません。)

変更する場合、こうしたリスクがあることを覚えておき、ご利用ください。

このパッケージで提供されているコマンドは、全て--templateオプションで、生成元のファイルを指定できるようです。

ですから、適当な場所に元ファイルをコピーし、自分の好みに変更し、コマンドシェルなどで--templateを含んだエイリアスを設定し、使用するほうが安全です。

ちなみにtemplateオプションで指定するパスは、ワーキングディレクトリーからの相対パスか、絶対パスで指定します。

Eloquentモデルの生成

モデル名を指定することで、その名前のEloquentモデルを生成してくれます。

php artisan generate:model モデル名

モデル名は先頭が大文字です。小文字で入力しても、大文字に変換されます。

Eloquentはもともと、簡単なコードだけで使用できるため、生成されるコードもたいしたことはありません。基本、この機能だけで利用すると言うよりは、後述のリソースを生成したり、スキャフォールディングを使用する場合に、利用されるものという理解をしておきましょう。

ビューの生成

ビューをbladeで生成します。

php artisan generate:view ビュー名

生成されるビューは、ただ文字列で一行です。

ビュー名.blade

これだけでは、たいして便利ではありません。自分でテンプレートを作成しておき、使用するのが良いでしょう。

php artisan generate:view ビュー名 --template=app/views/aaa/bbb

パッケージなどを作成する場合、ビューの出力先はappディレクトリーではなく、多分ワークベンチ下のどこかになります。そうした場合、--pathオプションで出力先を変更することができます。もちろん、デフォルトのapp/viewsを使用する場合でも、その下にサブディレクトリを作成し、その下に生成したい場合も、このおぽションで生成ディレクトリーを指定できます。パスはワーキングディレクトリーからの相対パスか、絶対パスで指定します。

 シードクラスの生成

テーブルの初期値設定を行うシードクラスの生成です。

php artisan gererate:seed テーブル名

このコマンドは、まず'テーブル名TableSeeder.php'ファイルを生成し、続いてDatabaseSeeder.phpへ、生成したクラスを実行するように、runメソッドを追加してくれます。

マイグレーションの生成

マイグレーションの生成は、Laravelのmigrate:makeコマンド以上の内容を生成してくれます。

例えば、名前と色の項目を持つ、applesテーブルを生成するには、以下のように指定します。

php artisan generate:migration create_apples_table --fields="name:string[20], color:string[10]"

create_apples_tableのapples部分が、テーブル名となります。名前のまま生成されますので、Laravelの標準的な規約に従うのであれば、複数形で指定しましょう。

先頭がcreatemakeであれば、新しいテーブルの作成コードを生成します。

increment('id')timestamps()は、自動的に付きます。タイムスタンプを使用しない場合は、削除しましょう。

フィールドには、オプションを指定することも可能です。

php artisan generate:migration create_dummy_table --fields="name:string:default('John'), email:string[320]:unique:nullable, age:insteger:unsigned"

テーブルに特定のフィールドを追加するマイグレーションを生成するには、以下のような指定になります。

php artisan generate:migrate add_項目名_to_テーブル名_table

ただし、ファイル名中に指定した項目名は無視されます。ファイル名指定の最初がaddinsertであれば、_tableの前の名前のテーブルの内容を変更する、コードが生成されます。

実際に操作するフィールドは、生成時と同じように、--fieldsオプションで指定します。ですから、実用的には、次のような形式で指定することになります。

php artisan generate:migration add_size_and_weight_to_apples_table --fields="size:integer:unsigned,weight:integer:unsighned"

今度は逆に、特定のフィールドを削除するマイグレーションの生成です。ファイル名指定の先頭がremovedeletedropの場合、フィールド削除のマイグレーションが生成されます。

php artisan generate:migration delete_size_and_weight_to_apples_table --fields="size:integer:unsigned,weight:integer:unsighned"

フィールド削除の場合でも、フィールドの属性を指定する必要があります。なぜなら、マイグレーションは、そのマイグレーションで行う作業をもとに戻すdownメソッドも用意する必要があるからです。

フィールドの削除は、追加と表裏一体です。

中間(ピボット)テーブルの生成

多対多リレーションを使用する場合、中間テーブルを生成する必要があります。その規約を思い出すのが面倒であっても、このジェネレーターは規約通りに生成してくれます。

php artisan generate:pivot テーブル名1 テーブル名2

中間テーブルは、二つのテーブルのレコードIDを押さえておくためのテーブルです。標準の規約に従うのであれば、テーブル名は複数形です。ですが、このコマンドに関しては複数形も単数形も受け付け、標準の単数形で生成してくれます。

生成されるコードは外部束縛を含んでいるようです。downメソッドではテーブルのdropだけ行なっていますが、外部束縛が行われている場合、単にテーブルのdropだけでは、削除されない場合もあります。場合によっては、全レコード削除、外部束縛削除、テーブル本体削除の手順が必要になるかも知れません。

テストの生成

ユニットテストを生成します。

php artisan generate:test テストクラス名

このコマンドも、元のテンプレートと、出力先を指定できます。デフォルトで生成されるファイルの内容は、たいしたものではありません。自分のやり方や環境に合ったテンプレートを作成し、使用するならば、便利に使用できそうです。

まとめて生成

たぶん、自動生成の旨みを味わうなら、以降の2コマンドがメインとなるでしょう。

生成をまとめて実行するため、2つのコマンドが用意されています。generate:resourceと、generate:scaffoldです。

generate:migrationと同様に、フィールドを指定することで、今まで見てきた、生成コマンドをまとめて行なってくれます。

リソースの生成

まずは、リソースの生成から見てみましょう。Orangeモデルを作成する場合です。

php artisan generate:resource orange --fields="name:string[20],color:string[30],weight:integer:unsigned,description:text"
  1. Orangeモデルを生成
  2. OrangeControllerを生成
  3. app/views/orange下に、index、show、create、editのbladeビューを生成
  4. 指定されたフィールドを生成する、create_orange_tableマイグレーションを生成
  5. OrangeTableSeederを生成
  6. DatabaseSeederにOrangeTableSeederを実行するように、更新
  7. routes.phpにRoute::resourceメソッドによるルートを追加

ドキュメントにはテストも作成されることになっていますが、現在、生成されないようです。

このコマンドを実行後、シードクラスでテストデーターを用意し、php artisan migratephp artisan db:seedを実行すれば、テストデーターを含んだテーブルが出来上がります。

その後、コントローラーでビューをリターンするようにコーディングし、ビューを記述、そしてWebブラウザでアクセスすれば、もう一応動作するアプリが完成します。

これが、スキャフォールディングを使用すると、もっと強力になります。

スキャフォールディングの実行

スキャフォールディングで行うのは、リソースとほとんど同じです。(テストも生成されるようです。)

バナナモデルで試してみましょう。

php artisan banana:scaffold --fields="name:string[20],weight:integer:unsigned:default(70)"

リソースとの違いは、動作するコードが一応生成されています。ですから、php atrisan migrateで、テーブルを生成したら、すぐにブラウザでアクセスし、テーブルの操作が可能です。

他のフレームワークのスキャフォールディングのように。(たぶん、他よりずっと簡単です。)

よくある「このフレームワークを使用すると、5分でCRUD操作ができるようになるまで、サイトが作れる」という自慢がありますね。このパッケージを使用すると、1分でできてしまいます。

Formの生成

どうやら、現時点ではうまく動作しないようです。そのためスキップします。

以上で、説明を終わります。読むと面倒そうですが、やってみれば簡単ですよ。