きまブログ

5/31 はてなダイアリーから移行しました。


自動コード生成のための補習 - Controller編

前回まで、FuelPHPを題材にして、MVCという構成について勉強しました。
FuelPHPで勉強するMVC - Controller編 - きまブログ
FuelPHPで勉強するMVC - View編 - きまブログ
FuelPHPで勉強するMVC - Model編 - きまブログ


これは、過去にPHP4(!)でvi(!)でベタ書き(!)で作ってきたウェブアプリであれば、
どのようにフレームワークベースに置き換えていけるか?
という視点から「改造」をベースに考えてきたからです。


でも、フレームワークの魅力は、コードの自動生成のようです。
FuelPHPの場合、これを「oil generate 〜コマンド」で実現します。


そこで、oilコマンドで生成されるコードの意味が分かるように、
いままでの学習の「補習」をしてみました。
今回は、MVCの構造ではなく、FuelPHPの構造のお勉強です。

手書きからコード自動生成へ - Controller編

とりあえず、実行してみます。
コマンドを叩くのは、oilが置いてあるプロジェクトの一番上のディレクトリです。
それ以外だと、なんか知らんエラーが出ます。。(これもナゾ。。)

$ oil generate controller ffff action1 action2
Creating view: /home/kima/test_app/fuel/app/views/template.php
Creating view: /home/kima/test_app/fuel/app/views/ffff/action1.php
Creating view: /home/kima/test_app/fuel/app/views/ffff/action2.php
Creating controller: /home/kima/test_app/fuel/app/classes/controller/ffff.php

4つのファイルを生成してくれました。
これを解析していきます。
まず、コントローラーから。

/fuel/app/classes/controller$ cat ffff.php 
<?php

class Controller_Ffff extends Controller_Template
{

	public function action_action1()
	{
		var_dump($this->template);
		$data["subnav"] = array('action1'=> 'active' );
		$this->template->title = 'Ffff &raquo; Action1';
		$this->template->content = View::forge('ffff/action1', $data);
		var_dump($this->template);
	}

	public function action_action2()
	{
		$data["subnav"] = array('action2'=> 'active' );
		$this->template->title = 'Ffff &raquo; Action2';
		$this->template->content = View::forge('ffff/action2', $data);
	}

}

いままでの学習から違うこと。

  1. 継承されるクラスは「Controller_Template」となったこと。
  2. action_actionX()メソッドにある、$data[“subnav”]とは?
  3. action_actionX()メソッドにある、$this->template->titleとは?
  4. action_actionX()メソッドにある、$this->template->contentとは?
Controller_Templateクラスとは?

場所:/fuel/core/classes/controller/template.php
従来のControllerクラスにbeforeメソッドとafterメソッドを追加したクラスです。
これらは、それぞれaction_*()メソッドを実行する前と後に自動的に実行されるメソッドみたい。


・before()メソッド
あらかじめ出力用の変数 $this->templateへ、
(生成された) /fuel/app/views/template.php を保存しておいてくれる。


・action_actionX()メソッド

ffff/action1.php で埋め込まれる $subnav に値を代入する。
template.php で埋め込まれる$titleと$content に値を代入する。
(この仕組みは、下記の マジックメソッド参照)


・after()メソッド
Ffffクラスでの処理を加えた、$this->template をreturnする。
だから、Ffffクラスであえて、View::forge()しなくても表示される。と思う。

PHP - マジックメソッドとは?

なぞ。
ホントにあってるかもナゾですが。。一応。。

$this->template->title = “something

titleなんて、プロパティはどこにもないぞ。
こんなことしたら、エラーになるんじゃない?

というわけで、$this->template->title = “something” を読み解いていきます。


$this->template は、View型のオブジェクトで、
(View型オブジェクト)->title = “something” で、
View型オブジェクトのプロパティtitleに文字列 ”something”を代入する。
という形。


$this->template は、Controller_Templateクラスのbeforeメソッドで、
あらかじめ View::forge($this->template) が代入されている。


問題なのは、プロパティ title これ自体は、どこにも存在しない。
このプロパティに代入する処理をするのが、
PHPのマジックメソッド「__set()」のなんだと思います。
これは、インスタンスに該当のプロパティやメソッドがない場合に処理をしてくれるメソッドで、
__set()は、存在しないプロパティに値を代入しようとするときに動作します。


これで、FuelPHPのViewクラスの場合、最終的に
$data[’title’] = ’something’ というようにしてくれる。
のかな?

  • -

ちなみに、__set()のような「マジックメソッド」は、
他にもたくさんあって、頻繁に目にするのが、
オブジェクトが生成された時に実行される「__construct()」 。
アンスコ2本で始まるのがその印みたい。。

  • -


次は、oilコマンドで生成されたViewを読み解いていきます。