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

デフォルトでは、生成されるクラス名は単数形です (一つの投稿を表す)。ですが、対応するテーブルは複数形で生成されます (複数の投稿が含まれる)。 --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

ビューモデル

任意でビューを伴うビューモデルクラスを oil で生成することができます。

$ php oil g controller posts action1 action2 action3 --with-viewmodel

マイグレーションの実行

次のコマンドは有用なマイグレーションタスクを実行する 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

マイグレーションの生成

モデルを生成せずにマイグレーションを生成可能です。テーブルをリネームするために使用されるか、他の環境に簡単にデプロイするためにテーブルにフィールドを追加するために使用されます。

$ 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 scaffolding

You can swap scaffold with admin and generate a controller which extends Controller_Admin instead of Controller_Template. On the first use of this command an admin skeleton will be generated, to expand this skeleton use the skip force argument. To generate in subdirectories name the prefix the model's name accordingly.

$ 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";

		/***************************
		 Put in TASK DETAILS HERE
		 **************************/
	}

	public static function cmd1($args = NULL)
	{
		echo "\n===========================================";
		echo "\nRunning task [Newtask:Cmd1]";
		echo "\n-------------------------------------------\n\n";

		/***************************
		 Put in TASK DETAILS HERE
		 **************************/
	}

	public static function cmd2($args = NULL)
	{
		echo "\n===========================================";
		echo "\nRunning task [Newtask:Cmd2]";
		echo "\n-------------------------------------------\n\n";

		/***************************
		 Put in TASK DETAILS HERE
		 **************************/
	}
}
/* End of file tasks/newtask.php */

設定

Config を生成するために次のコマンドを使用します:

$ 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 がない場合、COREPAT/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 */

Packages

To generate a Package, use the following command:

$ 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

The path where the package is generated is PKGPATH by default, but this value can be changed to any path defined in the package_paths config by passing the --path=package_path or -p=package_path option to the command.

Generate Driver-based Package

If you wish to generate a driver-based package, simply supply the --drivers or -d option:

$ 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

You can also generate your own drivers. Simply pass the driver names separated by commas to the --drivers or -d option:

$ 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

Generate Package with VCS files

If you wish to generate composer.json and README.md files for your package, simply supply the --vcs or -v option:

$ 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