FuelPHP のブログチュートリアル
[2014/07/24 追記]FuelPHP 1.7.2での 更新版 を書きました。
この文書は FuelPHP 1.1-rc1 を前提にしています。また、Getting Started with the Fuel PHP Framework に基づいています。
インストール
最初に oil コマンドをインストールします。
$ curl get.fuelphp.com/oil | sh
上記のコマンドは、/usr/bin/ に oil コマンドをインストールします。
続いて、FuelPHP をインストールします。
$ oil create blog
上記のコマンドは、カレントフォルダに blog フォルダを作成し、その中に FuelPHP のリポジトリを GitHub から clone します。
Note: コマンドラインを使わずに手動でインストールする方法もあります。
フォルダ構成
blog フォルダの中は以下のようになります。
blog/ docs/ ... ドキュメント fuel/ app/ ... 作成するアプリケーションの置き場 config/ ... 設定ファイル classes/ ... 作成したクラスの置き場 controller/ ... コントローラの置き場 model/ ... モデルの置き場 views/ ... ビューファイルの置き場 core/ ... FuelPHP 本体 packages/ ... パッケージ(core から分離されたもの) oil ... oil コマンド public/ ... Web ブラウザからアクセス可能にする公開領域
では、blog/public/ を http://localhost/blog/ でアクセスできるように Apache を設定します。
http://localhost/blog/ に Web ブラウザでアクセスすると以下のように表示されるはずです。
Hello World
「Hello World」を表示する Hw コントローラを作成してみます。fuel/app/classes/controller/ に hw.php を作成します。
<?php class Controller_Hw extends Controller { public function action_index() { echo 'Hello World!'; } }
http://localhost/blog/index.php/hw にアクセスすると、「Hello World!」と表示されます。
http://localhost/blog/ でこのメソッドが実行されるようにするには、fuel/app/config/routes.php を以下のように変更します。
--- a/fuel/app/config/routes.php +++ b/fuel/app/config/routes.php @@ -1,6 +1,6 @@ <?php return array( - '_root_' => 'welcome/index', // The default route + '_root_' => 'hw/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),
ビューを使う
ビューファイル fuel/app/views/hello.php を作成します。
<h1>Hello!</h1> <p>Hey <?php echo $name ?>, how's it going?</p>
fuel/app/classes/controller/hw.php に action_buddy() メソッドを追加します。
<?php class Controller_Hw extends Controller { public function action_index() { echo 'Hello World!'; } public function action_buddy($name = 'buddy') { $this->response->body = View::forge( 'hello', array('name' => $name) ); } }
View::factory() View::forge() メソッドの第2引数で渡した配列が、ビューファイルで変数として使えます。
(12/04 追記) factory() メソッドは全部 deprecated で、現在は forge() メソッドを使うようになっています。
http://localhost/blog/index.php/hw/buddy/H&M にアクセスすると以下のように表示されます。
データベースの設定
MySQL にデータベースを作成します。
CREATE DATABASE `blog_example` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
fuel/app/config/development/db.php を以下のように変更します。
<?php /** * The development database settings. */ return array( 'default' => array( 'type' => 'mysql', 'connection' => array( 'hostname' => 'localhost', 'port' => '3306', 'database' => 'blog_example', 'username' => 'root', 'password' => '', 'persistent' => false, ), ), );
アプリの作成
oil コマンドを使い scaffolding でファイルを生成します。
Note: コマンドラインを使わずに手動でファイルを作成することもできます。
post はモデル名、その後の引数はテーブル定義です。
$ oil generate scaffold post title:string summary:varchar[250] body:text Creating model: /home/kenji/work/fuelphp/blog/fuel/app/classes/model/post.php Creating migration: /home/kenji/work/fuelphp/blog/fuel/app/migrations/001_create_posts.php Creating controller: /home/kenji/work/fuelphp/blog/fuel/app/classes/controller/posts.php Creating view: /home/kenji/work/fuelphp/blog/fuel/app/views/posts/index.php Creating view: /home/kenji/work/fuelphp/blog/fuel/app/views/posts/view.php Creating view: /home/kenji/work/fuelphp/blog/fuel/app/views/posts/create.php Creating view: /home/kenji/work/fuelphp/blog/fuel/app/views/posts/edit.php Creating view: /home/kenji/work/fuelphp/blog/fuel/app/views/posts/_form.php Creating view: /home/kenji/work/fuelphp/blog/fuel/app/views/template.php
コントローラでは Posts と複数形に、モデルでは引数そのままの Post と命名されるようです。
scaffolding では、コントローラは Controller_Template を継承して作成されます。Controller_Template とは、標準の Controller にテンプレート機能を追加したものです。
モデルは、Model_Crud を継承して作成されます。Model_Crud とは、標準の Model に CRUD 機能を追加したものです。
マイグレーションを実行し、データベースに実際にテーブルを作成します。
$ oil refine migrate Migrated app:default to latest version: 1.
テーブル名は、コントローラ名と同じく posts と複数形になるようです。
これで scaffolding による最低限のアプリが完成しました。
http://localhost/blog/index.php/posts に Web ブラウザでアクセスしてみましょう。
「Add new Post」から記事を追加して、表示してみましょう。
バリデーションの追加
fuel/app/classes/controller/posts.php の action_create() メソッドにバリデーションを追加します。
以下のように変更します。
<?php ...(略)... public function action_create($id = null) { if (Input::method() == 'POST') { $val = Validation::forge(); // Add a field for title, give it the label "Title" and make it required $val->add('title', 'Title') ->add_rule('required'); // Now add another field for summary, and require it to contain // at least 10 and at most 250 characters $val->add('summary', 'Summary') ->add_rule('required') ->add_rule('min_length', 10) ->add_rule('max_length', 250); $val->add('body', 'Article body') ->add_rule('required'); if ($val->run()) { // Make a post based on the input (array) $post = Post::forge($val->validated()); // Try and save it if ($post->save()) { Session::set_flash('notice', 'Added post #' . $post->id . '.'); Response::redirect('posts'); } else { Session::set_flash('notice', 'Could not save post.'); } } else { Session::set_flash('notice', $val->errors()); } } $this->template->title = "Posts"; $this->template->content = View::forge('posts/create'); }
これで、例えば、空欄のまま記事を追加しようとすると、以下のようにエラーが表示されるようになりました。