Generate
コード生成を使用すると、多く繰り返すコードをビルドする開発回数をスピードアップすることができます。 これは - oil 全体にも言えますが- 完全にオプションです。後で全てのコードは好きなように編集可能です。次のような項目を生成することができます:
Controllers
事前に定義したアクションやビューを持つ 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 */
Models
フィールドをリストすることでシンプルな 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
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 オプションを使ってフィールド名を指定してください。
$ php oil g model post title:varchar[50] body:text user_id:int --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' => false,
'property' => 'my_created',
),
'Orm\Observer_UpdatedAt' => array(
'events' => array('before_save'),
'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),
'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');
}
}
マイグレーションを実行する
次のコマンドは有用なマイグレーションタスクを実行する 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.
マイグレーションを生成する
The following field types are supported: string[n], varchar[n], int[n], enum[value1, value2], decimal[n n], float[n n], text, blob, datetime, date, timestamp and 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 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');
}
}
設定
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 */