laravel5.1にECカート機能を付けてみる。
そのものなサービスプロバイダー(ライブラリ)があったので使ってみる。
https://github.com/Crinsane/LaravelShoppingcart
英語のチュートリアルがあった。
http://www.tutorials.kode-blog.com/laravel-5-shopping-cart
1, composerを使って、laravelにインストール(チュートリアルだと、バージョンが1.3と古い指定だったので、*に変更。現在の最新は2.2.3だった)
composer.jsonに書き込む(“gloudemans/shoppingcart”: “*”) & composer update
もしくは
composer require gloudemans/shoppingcart
する
2, インストールしたら、config/app.phpにプロバイダと別名(alias)に記載しておく(しないとlaravelから使えない。パスを通すのと一緒)
サービスプロバイダーから、必要なファイルをコピーするコマンドを入力!
1 2 3 4 |
php artisan vendor:publish Copied File [\vendor\gloudemans\shoppingcart\database\migrations\0000_00_00_000000_create_shoppingcart_table.php] To [\database\migrations\2016_10_18_081102_create_shoppingcart_tab le.php] Publishing complete for tag []! |
3, 試しにカート生成・商品を入れてみる。MVCを作るのは面倒なので、とりあえずroute.phpだけで実装してみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
use \Cart; // カートに商品追加 Route::get('/add', function () { // カートをクリア Cart::destroy(); // 商品ID, 商品名, 個数, 値段, 詳細情報 Cart::add([ 'id' => 'a123', 'name' => 'T-Shirt', 'qty' => 2, 'price' => 1000, 'options' => ['size' => 'large', 'color' => 'blue'] ]); // カートの中身を返す return Cart::content(); /* JSON形式。rowidはカート内に商品を追加した識別子として、自動的に付与される(同じ商品・同じ個数でも違うIDが付与されるので、追加する側が商品毎にまとめておく必要がある) { "9db10d274b69fedea0b761c97d32b787": { "rowId": "9db10d274b69fedea0b761c97d32b787", "id": "a123", "name": "T-Shirt", "qty": 2, "price": 1000, "options": { "size": "large", "color": "white" }, "tax": 210, "subtotal": 2000 }, "8282ccc994ff083f3e5a4570584bd211": { "rowId": "8282ccc994ff083f3e5a4570584bd211", "id": "abc", "name": "jeans", "qty": 1, "price": 3000, "options": { "size": "large", "color": "blue" }, "tax": 630, "subtotal": 3000 } } */ }); |
最初のCart::destroy();をコメントアウトすると、F5リロードするたびに同じカート内にaddされていく!!
セッション情報なので、IEやFFなど他のブラウザで開けば、関係ない。
4, カートの色々な操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
// カートの中身を表示 Route::get('/show', function () { // カートの中身を返す return Cart::content(); }); // カート内商品の個数を変更 Route::get('/update', function () { // 現在のカート情報を変数に格納 $carts = Cart::content(); // カート内の格納単位(通常は商品別)の個数を+1 foreach($carts as $cart){ Cart::update($cart->rowid, $cart->qty+1); } // カートの中身を返す return Cart::content(); }); // カート内を商品IDで検索 Route::get('/search', function () { // 商品IDで格納単位IDを取得 $rowId = Cart::search(array('id' => 'a123')); // 格納単位IDで、カート内の注文された商品情報+個数を取得 $item_in_cart = Cart::get($rowId[0]); // 商品IDにヒットした情報を返す return $item_in_cart; }); // 商品IDを使ってカートから商品を削除 Route::get('/remove', function () { // 商品IDで格納単位IDを取得(存在しない場合はNULLを返す) $rowId = Cart::search(array('id' => 'a123')); // 格納単位IDで、カート内から削除 if(!empty($rowId)){ Cart::remove($rowId[0]); } // カートの中身を返す return Cart::content(); }); // カートの商品総金額を返す Route::get('/total', function () { return Cart::total(); }); // カートの商品総額を返す(ただのtotalとの違いは?) Route::get('/subtotal', function () { return Cart::subtotal(); }); // カートの(種類に関係なく)商品数を返す。使い道無さそう…。実装が簡単だから入れた? Route::get('/count', function () { return Cart::count(); }); // カートの税金総額 Route::get('/tax', function () { return Cart::tax(); }); |
5, 消費税の設定
php artisan vendor:publish によってconfig/cart.phpという設定ファイルがコピーされているはずなので、日本の消費税率を指定する。
1 2 |
//元は21だった。アイルランドの消費税はなんと21%!! でも、食料品は0%らしい。 'tax' => 8, |
でも、変更されない…。なんでだろ?
PCを再起動したら8%に反映された。キャッシュ的な問題?