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_starttemporal_end は、マイグレーションの primary_key 配列に追加されませんのでご注意ください。それらを手動で追加する必要があります。

--no-timestampcreated_atupdated_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-timestampcreated_atupdated_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