Generate
コード生成を使用すると、多く繰り返すコードをビルドする開発回数をスピードアップすることができます。 これは - oil 全体にも言えますが - 完全にオプションです。後で全てのコードは好きなように編集可能です。次のような項目を生成することができます:
コントローラ
事前に定義したアクションやビューを持つ Controller のスケルトンを生成するために、 次ようなコマンドを使用します:
$ php oil g controller posts action1 action2 action3
Created view: APPPATH/views/posts/action1.php
Created view: APPPATH/views/posts/action2.php
Created view: APPPATH/views/posts/action3.php
Created controller: APPPATH/classes/controller/posts.php
これは次のようなコントローラを生成します:
class Controller_Posts extends Controller_Template
{
public function action_action1()
{
$this->template->title = 'Posts » Action1';
$this->template->content = View::forge('posts/action1');
}
public function action_action2()
{
$this->template->title = 'Posts » Action2';
$this->template->content = View::forge('posts/action2');
}
public function action_action3()
{
$this->template->title = 'Posts » Action3';
$this->template->content = View::forge('posts/action3');
}
}
/* End of file posts.php */
モデル
フィールドをリストすることでシンプルな Model を生成し、 自動的にマッチした Migration を生成します:
$ php oil g model post title:varchar[50] body:text user_id:int
Created model: APPPATH/classes/model/post.php
Created migration: APPPATH/migrations/001_create_posts.php
これは、Orm を使うシンプルなモデルを作成しますので、設定ファイルで Orm パッケージが有効になっていることを確認してください。このようなコードになります:
class Model_Post extends Orm\Model {
protected static $_properties = array(
'id',
'title',
'body',
'created_at',
'updated_at'
);
protected static $_observers = array(
'Orm\Observer_CreatedAt' => array(
'events' => array('before_insert'),
'mysql_timestamp' => false,
),
'Orm\Observer_UpdatedAt' => array(
'events' => array('before_save'),
'mysql_timestamp' => false,
),
);
}
/* End of file post.php */
あまりワクワクしませんが、マイグレーションはここでは有用な部分です:
namespace Fuel\Migrations;
class Create_posts
{
public function up()
{
\DBUtil::create_table('posts', array(
'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
'title' => array('constraint' => 50, 'type' => 'varchar'),
'body' => array('type' => 'text'),
'user_id' => array('constraint' => 11, 'type' => 'int'),
'created_at' => array('type' => 'datetime'),
), array('id'));
}
public function down()
{
\DBUtil::drop_table('posts');
}
}
もしマイグレーションの生成を望まないのなら、単に --no-migration
を追加します:
$ php oil g model post title:varchar[50] body:text user_id:int --no-migration
Created model: APPPATH/classes/model/post.php
デフォルトでは、生成されるクラス名は単数形です ( 1 つの投稿を表す)。ですが、対応するテーブルは複数形で生成されます (複数の投稿が含まれる)。
--singular
を使うことで、生成するテーブル名をモデル名と同じにすることができます。
Model_Crud を使うモデルの生成
FuelPHP v1.1 はリレーショナルデータのオーバヘッドなしで ORM を使うのと同じような機能を提供するシンプルな Model_Crud ベースのモデルを追加しました。--crud
を追加することで、そのようなモデルを生成できます。
$ php oil g model post title:varchar[50] body:text user_id:int created_at:datetime --crud
Created model: APPPATH/classes/model/post.php
Created migration: APPPATH/migrations/001_create_posts.php
これは Orm を使用したシンプルなモデルを生成します。設定ファイルでパッケージが有効かどうか確認してください。次のようになります:
class Model_Post extends \Model_Crud
{
protected static $_properties = array(
'id',
'title',
'body',
'user_id',
'created_at',
'updated_at'
);
protected static $_table_name = 'posts';
}
タイムスタンプオプションを指定せずにモデルを生成する
created/updated フィールドやオブザーバを除外するために --no-timestamp
を追加します。
$ php oil g model post title:varchar[50] body:text user_id:int --no-timestamp
class Model_Post extends \Orm\Model
{
protected static $_properties = array(
'id',
'title',
'body',
'user_id'
);
}
namespace Fuel\Migrations;
class Create_posts
{
public function up()
{
\DBUtil::create_table('posts', array(
'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
'title' => array('constraint' => 50, 'type' => 'varchar'),
'body' => array('type' => 'text'),
'user_id' => array('constraint' => 11, 'type' => 'int'),
), array('id'));
}
public function down()
{
\DBUtil::drop_table('posts');
}
}
タイムスタンプとタイムスタンプフィールドの変更
ORM モデルか CRUD モデル (\Model_Crud) のいずれかでタイムスタンプフィールドを使っている場合、独自のフィールド名を選ぶことができます。
--created-at
と --updated-at
オプションを使って
独自のフィールド名を設定します。
デフォルトでは、タイムスタンプは有効になっており、 UNIX 時間を integer 型で格納します。
もし、 MySQL の DATETIME 型がお好みであれば、--mysql-timestamp
オプションを使うことができます。
$ php oil g model post title:varchar[50] body:text user_id:int --mysql-timestamp --created-at=my_created
このようなコードになります:
<?php
class Model_Post extends \Orm\Model
{
protected static $_properties = array(
'id',
'title',
'body',
'user_id',
'my_created',
'updated_at'
);
protected static $_observers = array(
'Orm\Observer_CreatedAt' => array(
'events' => array('before_insert'),
'mysql_timestamp' => true,
'property' => 'my_created',
),
'Orm\Observer_UpdatedAt' => array(
'events' => array('before_save'),
'mysql_timestamp' => true,
),
);
}
<?php
namespace Fuel\Migrations;
class Create_posts
{
public function up()
{
\DBUtil::create_table('posts', array(
'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
'title' => array('constraint' => 50, 'type' => 'varchar'),
'body' => array('type' => 'text'),
'user_id' => array('constraint' => 11, 'type' => 'int'),
'my_created' => array('constraint' => 11, 'type' => 'int'),
'updated_at' => array('constraint' => 11, 'type' => 'int'),
), array('id'));
}
public function down()
{
\DBUtil::drop_table('posts');
}
}
Model_Soft を使うモデルの生成
FuelPHP v1.5 は ORM モデルをベースにした Model_Soft を追加しました。Model_Soft を使用するには、 --soft-delete
を追加します。
$ php oil g model post title:varchar[50] body:text user_id:int --soft-delete
このようなコードになります:
<?php
class Model_Post extends \Orm\Model_Soft
{
protected static $_properties = array(
'id',
'title',
'body',
'user_id',
'created_at',
'updated_at',
'deleted_at',
);
protected static $_observers = array(
'Orm\Observer_CreatedAt' => array(
'events' => array('before_insert'),
'mysql_timestamp' => false,
),
'Orm\Observer_UpdatedAt' => array(
'events' => array('before_update'),
'mysql_timestamp' => false,
),
);
protected static $_soft_delete = array(
'mysql_timestamp' => false,
);
}
<?php
namespace Fuel\Migrations;
class Create_posts
{
public function up()
{
\DBUtil::create_table('posts', array(
'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),
'title' => array('constraint' => 50, 'type' => 'varchar'),
'body' => array('type' => 'text'),
'user_id' => array('constraint' => 11, 'type' => 'int'),
'created_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
'updated_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
'deleted_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
), array('id'));
}
public function down()
{
\DBUtil::drop_table('posts');
}
}
もし deleted_at のフィールド名を変更したい場合、 --deleted-at
オプションに変更したい名前を設定します。
$ php oil g model post title:varchar[50] body:text user_id:int --soft-delete --deleted-at=mydeleted
Model_Temporal を使うモデルの生成
Model_Temporal を使用するには、 --temporal
を追加します。
$ php oil g model post title:varchar[50] body:text user_id:int --temporal
このようなコードになります:
<?php
class Model_Post extends \Orm\Model_Temporal
{
protected static $_properties = array(
'id',
'temporal_start',
'temporal_end',
'title',
'body',
'user_id',
);
protected static $_temporal = array(
'mysql_timestamp' => false,
);
protected static $_primary_key = array('id', 'temporal_start', 'temporal_end');
protected static $_table_name = 'posts';
}
<?php
namespace Fuel\Migrations;
class Create_posts
{
public function up()
{
\DBUtil::create_table('posts', array(
'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),
'temporal_start' => array('constraint' => 11, 'type' => 'int'),
'temporal_end' => array('constraint' => 11, 'type' => 'int'),
'title' => array('constraint' => 50, 'type' => 'varchar'),
'body' => array('type' => 'text'),
'user_id' => array('constraint' => 11, 'type' => 'int'),
), array('id'));
}
public function down()
{
\DBUtil::drop_table('posts');
}
}
temporal_start と temporal_end は、マイグレーションの primary_key 配列に追加されませんのでご注意ください。それらを手動で追加する必要があります。
--no-timestamp
は created_at と updated_at フィールドの両方を意味しデフォルトでtrueに設定されており、関連オブザーバーは省略されている。それらを戻すために --no-timestamp=0
とすると、このデフォルトを回避することができます。
temporal_start もしくは temporal_end フィールドの名前を変更したい場合、独自のフィールド名を設定するために --temporal-start
もしくは --temporal-end
を利用してください。
$ php oil g model post title:varchar[50] body:text user_id:int --temporal --temporal-start=mystart --temporal-end=myend
Model_Nestedset を使うモデルの生成
Model_Nestedset を使用するには、 --nestedset
を追加します。
$ php oil g model post title:varchar[50] body:text user_id:int --nestedset
このようなコードになります:
<?php
class Model_Post extends \Orm\Model_Nestedset
{
protected static $_properties = array(
'id',
'left_id',
'right_id',
'title',
'body',
'user_id',
);
protected static $_table_name = 'posts';
}
<?php
namespace Fuel\Migrations;
class Create_posts
{
public function up()
{
\DBUtil::create_table('posts', array(
'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),
'left_id' => array('constraint' => 11, 'type' => 'int', 'unsigned' => true),
'right_id' => array('constraint' => 11, 'type' => 'int', 'unsigned' => true),
'title' => array('constraint' => 50, 'type' => 'varchar'),
'body' => array('type' => 'text'),
'user_id' => array('constraint' => 11, 'type' => 'int'),
), array('id'));
}
public function down()
{
\DBUtil::drop_table('posts');
}
}
--no-timestamp
は created_at と updated_at フィールドの両方を意味しデフォルトでtrueに設定されており、関連オブザーバーは省略されている。それらを戻すために --no-timestamp=0
とすると、このデフォルトを回避することができます。
title, tree_id, left_id, right_id フィールドの名前を変更したい場合、独自のフィールド名を設定し --title
, --tre-id
, --left-id
, --right-id
のひとつを利用してください。
$ php oil g model post title:varchar[50] body:text user_id:int --nestedset --title=mytitle --tree-id=mytreeid --left-id=myleftid --right-id=myrightid
プレゼンタ
任意でビューを伴う Presenter クラスを oil で生成することができます。
$ php oil g controller posts action1 action2 action3 --with-presenter
マイグレーションの実行
次のコマンドは有用なマイグレーションタスクを実行する refine コマンドの使い方を示しています。 システムが現在マイグレーション 5 であると仮定しています。マイグレーションタスクはパラメータを指定し、直接そのバージョンに移動することができます。 または、バージョンを 1 つ 上げたり下げたりします。
$ php oil refine migrate
Currently on migration: 5.
$ php oil refine migrate --version=4
Migrated to version: 4.
$ php oil refine migrate --version=5
Migrated to version: 5.
$ php oil refine migrate:down
Migrated to version: 4.
$ php oil refine migrate:up
Migrated to version: 5.
次のフィールドの型をサポートしています: string[n], varchar[n], int[n], enum[value1, value2], decimal[n, n], float[n, n], text, blob, datetime, date, timestamp, time
Windows Powershell を使用して Oil コマンドを実行する場合、パラメータをカンマで区切って引用符 (decimal['n, n']) で囲む必要があります。そうしなければ Powershell はそれらを配列として認識しません。また、もし Git ユーザであれば、Git Bash を使用することもできます。
マイグレーションの生成
モデルを生成せずにマイグレーションを生成可能です。テーブルをリネームするために使用されるか、他の環境に簡単にデプロイするためにテーブルにフィールドを追加するために使用されます。
$ php oil generate migration rename_table_users_to_accounts
Building magic migration: rename_table
Created migration: APPPATH/migrations/002_rename_table_users_to_accounts.php
Magic マイグレーション
いくつかの "magic" マイグレーションがあり、自動的にあなたのマイグレーション名のプレフィックスに基づいたマイグレーションをビルドします。
$ php oil generate migration create_users name:text email:string[50] password:string[125]
$ php oil generate migration rename_table_users_to_accounts
$ php oil generate migration add_bio_to_accounts bio:text
$ php oil generate migration delete_bio_from_accounts bio:text
$ php oil generate migration rename_field_name_to_username_in_accounts
$ php oil generate migration drop_accounts
注意: マイグレーションを名付ける際に、誤ってキーワードで開始しないように注意してください。
スキャフォールド
スキャフォールドは、 Oil のコード生成のワクワクする部分です。このアプローチは、Rails から借用しており、偉大な功績があります。 それは、MVC スケルトンやマイグレーションだけでなく、デフォルトの CRUD コードを埋め込んで、 コマンドを記述した後にコードが実際に動作するという考えです。
$ php oil g scaffold monkey name:string description:text
Created model: APPPATH/classes/model/monkey.php
Created migration: APPPATH/migrations/003_create_monkeys.php
Created controller: APPPATH/classes/controller/monkeys.php
Created view: APPPATH/views/monkeys/index.php
Created view: APPPATH/views/monkeys/view.php
Created view: APPPATH/views/monkeys/create.php
Created view: APPPATH/views/monkeys/edit.php
Created view: APPPATH/views/monkeys/_form.php
$ php oil refine migrate
Migrated to latest version: 3.
2 番目のコマンドで実行されたコマンドを含み、このコマンドによって多くのコードが生成されたことがわかります。 コントローラは次のようになります:
class Controller_Monkey extends Controller_Template
{
public function action_index()
{
$data['monkeys'] = Model_Monkey::find('all');
$this->template->title = "Monkeys";
$this->template->content = View::forge('monkey/index', $data);
}
public function action_view($id = null)
{
$data['monkey'] = Model_Monkey::find($id);
$this->template->title = "Monkey";
$this->template->content = View::forge('monkey/view', $data);
}
public function action_create($id = null)
{
if (Input::method() == 'POST')
{
$monkey = Model_Monkey::forge(array(
'name' => Input::post('name'),
'description' => Input::post('description'),
));
if ($monkey and $monkey->save())
{
Session::set_flash('success', 'Added monkey #'.$monkey->id.'.');
Response::redirect('monkey');
}
else
{
Session::set_flash('error', 'Could not save monkey.');
}
}
$this->template->title = "Monkeys";
$this->template->content = View::forge('monkey/create');
}
public function action_edit($id = null)
{
$monkey = Model_Monkey::find($id);
if (Input::method() == 'POST')
{
$monkey->name = Input::post('name');
$monkey->description = Input::post('description');
if ($monkey->save())
{
Session::set_flash('success', 'Updated monkey #' . $id);
Response::redirect('monkey');
}
else
{
Session::set_flash('error', 'Could not update monkey #' . $id);
}
}
else
{
$this->template->set_global('monkey', $monkey, false);
}
$this->template->title = "Monkeys";
$this->template->content = View::forge('monkey/edit');
}
public function action_delete($id = null)
{
if ($monkey = Model_Monkey::find($id))
{
$monkey->delete();
Session::set_flash('success', 'Deleted monkey #'.$id);
}
else
{
Session::set_flash('error', 'Could not delete monkey #'.$id);
}
Response::redirect('monkey');
}
}
Admin スキャフォールド
scaffold ではなく admin と入力することで、Controller_Admin を継承したコントローラを Controller_Template の代わりに生成できます。
初めてこのコマンドを使うときには、Admin のスケルトンが生成されます。また、このスケルトンを展開する際には、-s
と -f
オプションが使えます。
サブディレクトリに生成するには、モデルの名前に基づいたプレフィクスを付けます。
$ php oil g admin project_entry title:string abstract:text full_text:text project_id:int is_draft:int order:int -s
Creating migration: APPPATH/migrations/012_create_project_entries.php
Creating model: APPPATH/classes/model/project/entry.php
Creating controller: APPPATH/classes/controller/admin/project/entry.php
Creating view: APPPATH/views/admin/project/entry/index.php
Creating view: APPPATH/views/admin/project/entry/view.php
Creating view: APPPATH/views/admin/project/entry/create.php
Creating view: APPPATH/views/admin/project/entry/edit.php
Creating view: APPPATH/views/admin/project/entry/_form.php
タスク
さらに、 oil で新しいタスクの雛形を生成できます。
$ php oil g task newtask cmd1 cmd2
次のように生成されます
<?php
namespace Fuel\Tasks;
class Newtask
{
public static function run($args = NULL)
{
echo "\n===========================================";
echo "\nRunning DEFAULT task [Newtask:Run]";
echo "\n-------------------------------------------\n\n";
/***************************
タスクの詳細をここに
**************************/
}
public static function cmd1($args = NULL)
{
echo "\n===========================================";
echo "\nRunning task [Newtask:Cmd1]";
echo "\n-------------------------------------------\n\n";
/***************************
タスクの詳細をここに
**************************/
}
public static function cmd2($args = NULL)
{
echo "\n===========================================";
echo "\nRunning task [Newtask:Cmd2]";
echo "\n-------------------------------------------\n\n";
/***************************
タスクの詳細をここに
**************************/
}
}
/* End of file tasks/newtask.php */
設定
設定 を生成するために次のコマンドを使用します:
$ php oil g config sample hello:world
Created config: APPPATH/config/sample.php
これは次のような設定を生成します:
return array (
'hello' => 'world',
);
/* End of file sample.php */
COREPATH から設定を生成する
APPPATH/config がない場合、COREPATH/config から設定を結合します。
$ php oil g config package
Created config: APPPATH/config/package.php
これは次のような設定を生成します:
return array (
'sources' =>
array (
0 => 'github.com/fuel-packages',
),
);
COREPATH や APPPATH から強制的に設定を更新する
COREPATH/config や combine APPPATH/config から APPPATH/config に設定を結合する
$ php oil g config form --overwrite
Created config: APPPATH/config/form.php
これは次のような設定を生成します:
return array (
'prep_value' => true,
'auto_id' => true,
'auto_id_prefix' => '',
'form_method' => 'post',
);
/* End of file form.php */
パッケージ
パッケージ を生成するには、次のコマンドを使います:
$ php oil g package sample
Creating file: PKGPATH/sample/classes/sample.php
Creating file: PKGPATH/sample/config/sample.php
Creating file: PKGPATH/sample/bootstrap.php
パッケージが生成されるパスは、デフォルトでは PKGPATH ですが、この値は package_paths
設定に設定されているどのパスにも --path=package_path
または -p=package_path
オプションをコマンドに渡すことで、変更できます。
ドライバベースのパッケージを生成する
もし、ドライバベースのパッケージを生成したい場合は、--drivers
または -d
オプションを指定してください:
$ php oil g package sample -d
Creating file: PKGPATH/sample/classes/sample.php
Creating file: PKGPATH/sample/classes/sample/driver.php
Creating file: PKGPATH/sample/config/sample.php
Creating file: PKGPATH/sample/bootstrap.php
独自のドライバを生成することも可能です。カンマ区切りのドライバ名を --drivers
または -d
オプションに渡してください:
$ php oil g package sample -d=driver1,driver2
Creating file: PKGPATH/sample/classes/sample.php
Creating file: PKGPATH/sample/classes/sample/driver.php
Creating file: PKGPATH/sample/classes/sample/driver1.php
Creating file: PKGPATH/sample/classes/sample/driver2.php
Creating file: PKGPATH/sample/config/sample.php
Creating file: PKGPATH/sample/bootstrap.php
VCS ファイル付きのパッケージを生成する
パッケージのための composer.json と README.md ファイルを生成したい場合は、--vcs
または -v
オプションを追加してください:
$ php oil g package sample -v
Creating file: PKGPATH/sample/composer.json
Creating file: PKGPATH/sample/README.md
Creating file: PKGPATH/sample/classes/sample.php
Creating file: PKGPATH/sample/config/sample.php
Creating file: PKGPATH/sample/bootstrap.php
モジュール
モジュール を生成するには、次のコマンドを使います:
$ php oil g module blog
このコマンドは blog
フォルダをあなたのアプリケーションの config.module_paths
で定義されたモジュールパスに作成します。もし、複数のパスが定義されていれば、例えば、次のような選択するパスのリストが表示されます:
$ php oil g module blog
Your app has multiple module paths defined. Please choose the appropriate path from the list below
[1] /var/www/fuel/shared/modules/
[2] /var/www/fuel/app/modules/
より楽にモジュールを生成するために、--folders
オプションで、カンマ区切りの生成するフォルダのリストを指定することができます。それらはほぼ無制限にネストすることができ、親フォルダを指定する必要はありません。短く、しかし、有用な例は次のようになります:
$ php oil g module blog --folders=classes/model,classes/controller,config,lang