みなさまこんにちは!今年4月から新卒入社しました、ほんごうです。
今回、開発合宿に初参加させていただきました!
そこで、初心者プログラマとしてPHPのフレームワークに触れ、Model,View,Controllerを使い分けや、3機能間でどのようにデータの受け渡しを行っているのかを体感することにしました。
今回はFuelPHPでハマった箇所をつらつらと書いていこうと思います。
フォルダ構成
フォルダ構成は以下のようになっています。正解はこちらです。
コーディング規約
• ファイル名はすべて小文字にする
- 全体
• クラス名の単語は最初の文字は大文字でその他は小文字にする
• クラス名の中の「_」はフォルダ区切りになるはじめてのフレームワークとしてのFuelPHP
- Controller
• クラス名には「Controller_」という接頭辞を付ける
• クラス名の単語は最初の文字は大文字でその他は小文字にする
• クラス名の中の「_」はフォルダ区切りになる
• Controller クラスを継承 (extends) する- Model
• Model クラスを継承 (extends) する
Model
準備、基本
- 保存場所 "./fuel/app/classes/model/"
- データベース設定を記述する。(ローカルでサクッと動かした例)
<!--?php return array( 'form' =--> array( 'type' => 'mysql', 'connection' => array( 'hostname' => 'localhost', 'port' => '3306', 'database' => 'test_form', 'username' => 'root', 'password' => 'root', ), ), );
ハマったこと
- 名前空間を指定する【1】
現在の名前空間の外部にあるグローバルからクラスを使う時には、 バックスラッシュを接頭辞としてつけることを忘れないでください。
モデル - 概要 - FuelPHP ドキュメント
- DBクラスの使用を明示する【2】
take DB from global, not Fuel\Core\DB and you forgot the backslash prefix in the second example.
Confusion creating Model Classes · Issue #247 · fuel/docs · GitHub
- データベースから取得したデータは、配列としてデータを渡す【3】
データベースの結果をビューに渡す場合は、as_array()関数を使うことがわかり、やっと解決できました。下記のように修正しました。例.
FuelPHPでデータベース接続 | WinRoad徒然草
<!--?php namespace Model; //【1】 use DB; //【2】 class Form extends \Model{ public static function get_list(){ $sql = 'SELECT * FROM posted '; $query = DB::query($sql); //$query = \DB::query($sql); //【2】 $result = $query--->execute('form')->as_array(); //【3】 return $result; } }
Views
準備、基本
- 保存場所 "./fuel/app/views/"
- "./fuel/app/views/template.php"にhead情報を記述して、viewファイルはbodyの中身だけを記述すればよい状態にするのがオススメ【1】
<!DOCUTYPE html> <meta /> <!--?php echo $content;?--> <!-- 【1】 -->
Controller
準備、基本
- 保存場所 "./fuel/app/classes/controller/"
- "action_●●()"というfunctionは"DOCUMENTROOT/form/●●/"のURLで実行される【1】
- テンプレートにデータを渡し、表示情報を取得するには、View::forgeを用いる【2】
ハマったところ
- Modelで記述したFormクラスの使用を明示する【3】
PHP は、現在の名前空間にクラスをインポートするための use キーワードをもっています。 このキーワードによって、特定のクラスのファイルの中で、モデルクラス名 Model\Welcome を Welcome という単純な名前に短縮出来ます。
モデル - 概要 - FuelPHP ドキュメント
<!--?php use \Model\Form; //【3】 class Controller_Form extends Controller{ public function action_index(){ // 【1】"DOCUMENTROOT/form/"のURLで実行される $data['input'] = Form::get_list(); $this--->template->content = View::forge('form/index',$data); // 【2】 } public function action_confirm{ // 【1】"DOCUMENTROOT/form/confirm/"のURLで実行される } }
参考
感想
見ての通り、同じような箇所(名前空間等)でハマっていることがわかります。フレームワークを学ぶことでMVCのデータの動きを意識することができたが、PHPという言語自体の知識を身につけないといけないと切実に感じました。
これからも、コーディングの楽しみを忘れずに働けていければよいと思っています。