ECサイト運営開発記

PHPフレームワーク Laravelの使い方を中心とした通販サイトの開発日記

Laravel4でコントローラーの作成とモデルの作成に関する簡単なまとめ

Laravel4のBeta4がリリースされ動きが活発なLaravel。

Laravel4のコントローラーの作成とモデルの作成に関する簡単なまとめを残しておこうと思います。

[下準備]

[新しいコントローラーの作成]

  • app/controllers/のディレクトリに新しいコントローラーの作成する
    • デフォルトではBaseControllerとHomeControllerのふたつ。
  • サンプルとして、このディレクトリにShopControllerという名前のコントローラーを作成する
    • ファイル名は一応、ShopController.php。ただし、必ずしも、この名前じゃなければいけないわけではない。詳しくは後述。
    • BaseControllerを継承するコントローラークラス
    • アクションとして、indexアクションを作成する。
      • アクションメソッドはHTTPメソッド+アクション名の形。
        • アクション名がindexでGETで呼び出される場合は、getIndex。POSTで呼び出される場合は、postIndexという具合。
      • 以下のコードでは、ただ、Shop Index! という文字列がブラウザ上に表示されるサンプル。
        • return "String" で文字列が出力されます。
        • 同様にViewオブジェクトをreturnした場合も、文字列が返却されるので、ブラウザにHTMLが出力されます。
<?php
class ShopController extends BaseController {

	public function getIndex(){
	  return "Shop Index!";
	}

}

ただし、この状態で、http://localhost/project/public/shop/にアクセスしてもエラーになるだけ。

  • ここからが重要。
    • Laravel4では新しいクラスファイルを作成した場合、プロジェクトルートにて、composer dump-autoloadを実行しなければならない
      • このコマンドを実行することによって、ShopControllerの存在がプロジェクトに認識されることになる。
        • Generating autoload filesと表示されればOK。
    • 正しく、ShopControllerの存在が認識されているか確認するには?
      • vendor/composer/autoload_classmap.phpを開いてみればわかる。
      • 長〜い配列の中に、自身で作成したShopControllerがオートロード一覧に入っていれば、OK。
      • 見てみれば、なんとなくわかるように、ファイルとクラス名のマッピングが行われており、ファイル名は実はshop.phpでもOKだったりする。
        • 例えば、ファイル名がyamada.phpでもコードの中でShopContorllerと書いてあれば、ShopControllerがマッピングされる。もちろん、望ましくはない。
<?php

// autoload_classmap.php generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'BaseController' => $baseDir . '/app/controllers/BaseController.php',
    'DatabaseSeeder' => $baseDir . '/app/database/seeds/DatabaseSeeder.php',
    'HomeController' => $baseDir . '/app/controllers/HomeController.php',
    /** 中略 **/
    'ShopController' => $baseDir . '/app/controllers/ShopController.php',
    'TestCase' => $baseDir . '/app/tests/TestCase.php',
    'User' => $baseDir . '/app/models/User.php',
);

コントローラークラスのオートロードが確認できたら、今度はルーティングの設定。
作ったコントローラーを呼び出すための定義をしなければならない。

  • app/routes.phpを開く
    • デフォルトでは、publicルートの定義のみが行われているだけ。
    • project/public/shop/というURIで呼び出すためのコントローラーを登録するためには?
      • Route::controller('shop', 'ShopController');
        • 基本これだけでOK。

で、ブラウザでhttp://localhost/project/public/shop/にアクセス!
Shop Index!と表示されていれば、ひとまず、コントローラーの作成に成功!

[新しいモデルの作成]

  • モデルファイルを作って、DBからデータを取得するサンプルにチャレンジしてみる。
    • DBはとりあえず、MySQLで、商品テーブルからデータを取得するという想定で。
      • 商品情報が保存されているitemテーブルには、商品ID=item_id=主キー、商品名=item_name、価格=item_priceの3つのフィールドがあるする。
      • サンプルデータは適当に入れておいて下さい。
  • まずは、app/config/database.phpにある、mysqlの項目を環境に合わせて変更。
<?php

	'mysql' => array(
		'driver'    => 'mysql',
		'host'      => 'localhost',
		'database'  => 'sample_db',
		'username'  => 'user',
		'password'  => 'password',
		'charset'   => 'utf8',
		'collation' => 'utf8_unicode_ci',
		'prefix'    => '',
	),
  • 次にモデルクラスの作成。app/models/にItem.phpというファイルを作成。
    • ItemクラスはLaravelのORMである、Eloquentクラスを継承する。コードは以下の様な具合で。
<?php

class Item extends Eloquent {
	
	protected $table = 'item';
	protected $primaryKey = "item_id";
	public $timestamps = false;

}
  • $timestampsは created_atとupdated_atのフィールドを更新するためのもの。今回のテーブルには両方共存在しないので、falseを設定。
  • 次はコントローラークラスを作成した時と同様に、プロジェクトルートにて、composer dump-autoloadを実行。Generating autoload filesと表示されていればOK。

[コントローラーにアクションメソッドを追加]

    • 先ほど、作成したShopControllerにgetListメソッドを追加。
      • メソッドはGETで呼び出され、全ての商品名を出力するコードを記述。
    • ORMのEloquentの詳しい使い方に関しては、ドキュメントを参照してみて下さい。
      • なんらかのフレームワークを使ったことがある人には、それほど、習得の敷居は高くないと思います。
<?php
class ShopController extends BaseController {

	public function getList(){
	  foreach(Item::all() as $item){
	    echo $item->item_name."<br />";
 	  }
	}

}

とりあえず、今日はここまで。追記もあるかもしれません。