ECサイト運営開発記

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

MVCフレームワーク Laravel 3.0

FuelPHPを勉強してみたが、ORMがなんとなく、気に入らなかったので、他のフレームワークを探してみると、気になるフレームワークを発見。それがLaravel。なんて、読むのかは知らない。ララヴェル

公式サイトは以下のとおり。
http://laravel.com/

[概要]

  • Laravel is a clean and classy framework for PHP web development.
  • ZendFramework、CakePHPSymfony、CodeIgniterのどれかを使ったことがあれば、取っ付き易い。
    • インストールは非常に簡単で、公式サイトのこの辺を読めばなんとなくできる。
    • しかし、日本語情報はほぼ皆無。m-tagさんのダイアリーしか出てこない。
      • 英語の情報も洋書が一冊も見つからないような状態。歴史はかなり浅い?
  • Slimのようなマイクロフレームワークのような使い方もできる。
    • application/routes.php に記述
<?php 

/* 中略 */
Route::get('/', function()
{
    echo "Hello World!";
});
Route::post('/input/', function()
{
    echo "this is post!";
});

?>
  • Eloquentというシンプルで強力なORマッパーがある。
    • Relationに関しては、結構、パワフルな印象。
      • ただ、ちょっと余計なお世話な機能もある?
    • 標準でkey/valueデータストアのREDISも使える
    • 拡張で、MongoDBも使える
  • もちろん、キャッシュやセッション、ファイルのアップロードなどアプリケーション構築に必要な機能は搭載
    • 入力検証のバリデーション機能は、CodeIgniterライク
<?php 

$input = Input::all();
$rules = array(
    'name'  => 'required|max:50',
    'email' => 'required|email',
);

$validation = Validator::make($input, $rules);
if ($validation->fails()){
  return $validation->errors;
}

?>
    • オートローダーも付属
      • ディレクトリ単位で読み込み
<?php
Autoloader::directories(array(
    path('app').'extra',
));
?>

[Eloquentを利用したアプリケーションサンプル]

  • 目的:武器、防具、道具の3つのカテゴリー別の商品一覧を表示するだけ
  • まず、以下の様なMySQLデータベースを用意。
    • DB名:framework_db
      • 商品テーブル:item
      • カテゴリーテーブル:category
      • 商品とカテゴリーの関連テーブル(いわゆる中間テーブル):category_item
    • 設定ファイルに接続情報を記述
      • application/config/database.phpを編集
<?php

// 使用するデータベース
'default' => 'mysql',

/* 中略 */ 
'connections' => array(
  'mysql' => array(
    'driver'   => 'mysql',
    'host'     => '127.0.0.1',
    'database' => 'framework_db',
    'username' => 'user',
    'password' => 'password',
    'charset'  => 'utf8',
    'prefix'   => '',
),
?>
--
-- 商品テーブル
--
CREATE TABLE IF NOT EXISTS `item` (
  `item_id` int(11) NOT NULL AUTO_INCREMENT,
  `item_image_id` int(11) NOT NULL DEFAULT '1',
  `item_name` varchar(255) NOT NULL,
  `item_price` int(11) NOT NULL DEFAULT '0',
  `del_flg` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`item_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

--
-- 商品データ
--
INSERT INTO `item` (`item_id`, `item_image_id`, `item_name`, `item_price`, `del_flg`) VALUES
(1, 1, '銅の剣', 80, 0),
(2, 1, 'ひのきの棒', 50, 0),
(3, 1, 'イバラのムチ', 120, 0),
(4, 1, 'レイピア', 90, 0),
(5, 1, 'ドラゴンキラー', 450, 0),
(6, 1, '竹の槍', 55, 0),
(7, 1, '鉄の鎧', 150, 0),
(8, 1, '麦わら帽子', 35, 0),
(9, 1, '鉄仮面', 0, 0),
(10, 1, '金の鎧', 690, 0),
(11, 1, 'アイスソード', 10000, 0),
(12, 1, '薬草', 5, 0),
(13, 1, 'ポーション', 30, 0),
(14, 1, '赤いリボン', 15, 0),
(15, 1, '釘バット', 40, 0);

--
-- カテゴリーテーブル
--
CREATE TABLE IF NOT EXISTS `category` (
  `category_id` int(11) NOT NULL AUTO_INCREMENT,
  `category_name` varchar(255) NOT NULL,
  `del_flg` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`category_id`)
);
INSERT INTO `category` (`category_id`, `category_name`, `del_flg`) 
VALUES(1, '武器', 0), (2, '防具', 0),(3, '道具', 0);

--
-- 商品とカテゴリー関連付けをするテーブル
--
CREATE TABLE IF NOT EXISTS `category_item` (
  `category_item_id` int(11) NOT NULL AUTO_INCREMENT,
  `category_id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  `del_flg` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`category_item_id`)
);
INSERT INTO `category_item` (`category_item_id`, `category_id`, `item_id`, `del_flg`) VALUES
(1, 1, 1, 0),
(2, 1, 2, 0),
(3, 1, 3, 0),
(4, 1, 4, 0),
(5, 1, 5, 0),
(6, 1, 6, 0),
(7, 2, 7, 0),
(8, 2, 8, 0),
(9, 2, 9, 0),
(10, 2, 10, 0),
(11, 1, 11, 0),
(12, 3, 12, 0),
(13, 3, 13, 0),
(14, 2, 14, 0),
(15, 1, 15, 0);
  • ELOQUENT ORM
    • FuelPHPのモデルはいちいち、フィールドリストを定義しないといけなかったりと、面倒でしたが、Elquentはそんなの不要。
    • モデルの定義
      • Eloquentを継承して、テーブル名と主キーを設定するだけ。
        • public static $table = "テーブル名";
        • public static $key = "主キー";
    • リレーションは1対1、1対多、多対多などできる。
<?php

// models/item.php
class Item extends Eloquent {
  public static $table = "item";
  public static $key = "item_id";
}

// models/category.php
class Category extends Eloquent {

  public static $table = "category";
  public static $key = "category_id";

  public function itemList(){
    $itemList=$this->has_many_and_belongs_to("Item","category_item")->select();
    return $itemList;
  }
}

?>
    • モデルの定義は基本これだけ。
  • コントローラー側での呼び出し
    • application/routes.phpにRoute::controller("home");を記述。
    • 面倒なので、Home_Controllerに書く。
<?php
class Home_Controller extends Base_Controller {

  // 全てのカテゴリ一覧を表示するアクション
  // http://example/home/list/
  public function action_list(){
    var_dump(Category::all());
  }

  // カテゴリー内の商品を表示するアクション
  // http://example/home/category/:categoryId/
  public function action_category($categoryId){
    var_dump(Category::find($categoryId)->itemList);
  }

}
?>
    • と、基本これだけ。ただし、使用する上で、注意しなければいけない点、躓いた点、いろいろあったので、それは後日、書き残しておくことにする。
      • has_many_and_belongs_toを使った上で更にテーブル結合する場合など。