PHP/Laravelでチケット購入サイトのポートフォリオを作ってみた！

:::note alert
ポートフォリオの公開を終了しました。
:::
タイトル：渋谷ST劇場チケット販売サイト
製作期間：1ヶ月
開発環境：AWS Cloud9、PHP 7.2.22、Laravel Framework 5.8.35、Bootstrap v4.3.1、

①作成した目的
Webエンジニアとして活動したく、PHPとLaravelを学習。
その一環で、ポートフォリオを作成。

ショッピングサイトやチケット購入サイトを利用することが多く、
自分でもECサイト関連を作ってみたいと思った。

②実装した機能
<ul>
<li>申し込み前の確認画面
申込処理の前に、確認画面を表示。
また、チケットの金額・枚数に応じて合計金額を表示できるように。
合計金額の計算処理は、OrderモデルのgetPriceInfoにて行う。

```php:OrderController.php
$priceInfo = Order::getPriceInfo($form['price'], $form['number']); 
```

```php:Order.php

    const COM = 110; //手数料

    public static function getPriceInfo($price, $number) {
        $com = self::COM; //手数料
        $price = $price * $number; //チケット代金×枚数
        $com_total = self::COM * $number; //手数料×枚数
        $payment = $com_total + $price; //合計金額
        return compact('com', 'price', 'com_total', 'payment');
    }

```

</li>
<li>メール自動送信機能
Gmailを利用して、申込確認メールとパスワードリセットメールを送信できるようにした
![デフォルト 2019-12-01 17.26.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505467/a11d3afc-9bf7-874c-63f0-7f411b688481.png)
</li>

```php:OrderController.php
Mail::send(['text' => 'mail.text'], $data, function($message){ $message->to(Auth::user()->email)->subject("申込確認メール"); }); //確認メール送信
```

<li>管理画面・管理者権限(is_admin)
管理画面はis_adminを利用して、管理者ユーザのみ閲覧できる様に設定</li>
・管理画面
![デフォルト 2019-12-01 15.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505467/af5ac518-80f1-775a-0448-7d95a1efa06d.png)

・チケット一覧画面
![デフォルト 2019-12-01 15.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505467/8dc15557-7652-c9e8-c314-73d0197552ac.png)

・チケット作成画面（編集画面も同様）
![デフォルト 2019-12-01 15.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505467/74dafc38-234f-2d30-6c27-2c77924af671.png)

・会員一覧画面
![デフォルト 2019-12-01 15.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505467/b3fe634e-865e-2497-776f-47d03066e5ac.png)

・会員別の注文履歴画面
![デフォルト 2019-12-01 15.41.24（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505467/f0c9db77-6c13-e269-5a72-6d4873ea03a2.png)

注文の取消を行うと、元のページへのリダイレクトに失敗してしまう為、対象のユーザーの画面に戻るようURLの後ろに[?id='.$user_id]をGETで渡せるようにした。

```php:UserController.php
public function cancel(Request $request)
    {
        $order = Order::find($request->id);
        $user_id = $request->user_id;
        $order->delete();
        return redirect('admin/user/order?id=' . $user_id);
    }
```

<li>トランザクション処理
DB::transaction を使って実装。

```php:OrderController.php
        DB::transaction(function() use ($order)
        {
            Ticket::find($order->ticket_id)->decrement('stock', $order->number);
            $order->save();
        });
```        

「use Illuminate\Support\Facades\DB;」の設定を手動で入れた。
</li>
</ul>

③苦労した点
<ul>
<li>申し込み処理前の確認画面
確認画面(confirm)の処理で、どのように受付画面(index)からの値を受け取るか悩んだ。(調べても例が少なかった)
inputタグのhidden型を使って、隠しデータとして送信する仕組みにした。</li>

```php:confirm.blade.php
<input type="hidden" value="{{ $form['ticket_id'] }}" name="ticket_id" />
```

<li>トップ画面(index)のデザイン
Bootstrap4を活用してレシポンシブデザインにしたが、レイアウトを崩さず表示できるように整えるのに時間掛かった。</li>
</ul>

④ソースコード・制作前のアイディア図
いち機能実装ごとにコミットしてある。
~~https://github.com/masahiro-111/ticketsite001~~
制作前のアイディア図
![IMAG1247.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505467/40fc467e-5ee2-53fb-17eb-8a1aecd213e9.jpeg)