ECサイト運営開発記

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

Bootstrap4とLaravel5.1でネットショップをリニューアルした

カレンダーの通販サイト E-カレンダー.comをリニューアルしたので、記録とし、まとめておこうと思います。

以下、リニューアル前の環境。

[リニューアル前]

  • サーバーはGMOクラウドPublicのVPS
  • Apache1.3系、PHP5.3、MySQL5系のよくある環境。
  • WebアプリケーションフレームワークはZendFramework
  • キャッシュはファイルキャッシュ
  • HTML5とTwitterBootstrap2を使用してデザイン。

[リニューアル後]

  • GMOクラウドPuiblic VPSで変わらず
  • Apache2.3、PHP5.5へアップグレード
  • データベースはAWS上のRDSインスタンス
    • 商品情報の読み込みなどはREST叩いてJSONデータを取得する形式。
    • 注文や問い合わせの処理なども同様に、AWSのEC2インスタンスにRESTで命令を出す
    • ショッピングカートのセッションはAWS上のRedisサーバーに保存する。
  • WebアプリケーションフレームワークはLaravel5.1を使用
  • JSONデータのキャッシュはファイルキャッシュ
  • HTML5とTwitterBootstrap4 Alphaを使用

なぜ、Laravel5.1に?

ZendFrameworkを全く触らなくなって、最新のバージョンで開発する気が全く起きなかった。
乗り換えるフレームワークとしてCakePHPやCodeIgniterなども検討したが、Composerによるパッケージ管理システムが気に入ってしまい、
それからはずっとLaravelを勉強し、今回のリニューアルを機に本格的に採用。

以下、Laravelの良い点。

  • Composerでパッケージの管理がとても楽。依存関係もきっちり解決してくれる。
    • ライブラリの追加がとっても楽。
  • 従来通りのMVCパターンで開発できる(構築方法を強要されない)
  • 開発環境と本番環境で設定ファイルを複数作る必要がない。.envファイルに本番環境用との差分を記述すればいいだけ。
  • Eloquentはやっぱり便利。
  • Redisとの相性がいい。
  • Bladeテンプレートが簡単。
  • AWSとの相性がいい。
  • ドキュメントがわかりやすい。

と、まぁ、おおよそこんな具合。習得までの時間はさほどかからず、慣れてしまえばなんてことはなく、とても素晴らしいフレームワークだと思う。5.0系になって、ディレクトリ構造が見直され今まで存在していたmodelsディレクトリが削除されるなど、少し戸惑った部分はあったが、自分で作って、モデルファイルを入れておけば、従来通りのMVCパターンで構築できる。

Composerで便利だったパッケージ

  • illuminate/html
    • ViewファイルでのFormヘルパ
// テキストボックス
{!!Form::text("name")!!}

// エラーで入力画面に戻った場合
{!!Form::text("name",Input::old("name"))!!}

// セレクトボックス
{!!Form::select("pref",Config::get("site.pref")))!!}
  • jenssegers/agent
    • デバイス情報やブラウザの情報がわかるパッケージ
    • FacebookのSocial PluginはIEの古いバージョンには非対応なため、Baldeテンプレート内で、バージョンの判定を行う。
      • Bootstrap4未対応のIE8.0対策
//ブラウザのバージョン
Agent::version(Agent::browser());

//スマートフォンかタブレットかの判定も可能
Agent::isMobile();
Agent::isTablet();
  • webpay/webpay
    • クレジットカード決済WebPayの公式パッケージ
      • カードの情報からトークンを作成して、決済を行うサンプル
<?php

// トークンの作成
$webpay = new WebPay('secret_key');
$token=$webpay->token->create(array(
   "card"=>
    array("number"=>"*********",
     "exp_month"=>01,
     "exp_year"=>2016,
     "cvc"=>"123",
     "name"=>"HOGE HOGE")
));

// 決済
$webpay->charge->create(array(
   "amount"=>500,
   "currency"=>"jpy",
   "card"=> $token
   "description"=>"これで決済完了!"
));

  • predis/predis
    • Redisを利用する際に必須のパッケージ
      • パッケージをインストールして、config/session.phpのdriverをredisに変更するだけ
<?php

'driver' => 'redis',

?>
  • league/flysystem-aws-s3-v2
    • 商品画像をS3ストレージに保存する際に利用。
    • 以下ローカルファイルをS3にアップロードするサンプル
// ローカルのディスクから画像データを取得
$local=Storage::disk("local");
$data=$localDisk->get("images/item/sample.jpg");

// S3ディスクにアクセスしてアップロード
$s3=Storage::disk("s3");
$s3->put("images/item/sample.jpg",$data);
Laravelの悪い点
  • PHP5.5.9以上じゃないと動かない
  • 名前空間がいちいち面倒くさい
    • コントローラーの中でモデルクラスで商品検索をする場合
      • use App\Models\Item;を宣言して、アクションメソッドの中でItem::search("name")と記述する または↓;
      • App\Models\Item::search("name")と名前空間からメソッドまで全書きをする。
      • Laravelで用意してくれているコアクラスもいちいち、useしなくちゃいけない。
        • しかし、Laravelの設計思想的にこれは逃れられそうにないので、習慣として割り切るしかない。
  • オートロードに時間がかかる?
    • その他のフレームワークにも言えることだが、フレームワークが巨大になるとこういう話がどうしても出てくる。
      • 将来的に別のVPSサービスに移行予定なので、SSDプランの物を選んで解決できればいいかな?