【未経験者】PHPとLaravelそれぞれで類似ポートフォリオ作ってみた

# はじめに
こんにちは、おーもとと申します。エンジニアに転職をするため学習している初学者です。
私は車が好きで、「近年の若者の車離れ」という問題にフォーカスしたアプリを制作しようと思いました。
色々あって、生のPHPとLaravelの二通りの類似ポートフォリオを制作したので、記事にしてみました。
# 制作背景
若者が車を持たない理由には様々な理由があると思いますが、
「欲しいと思えるほど魅力を感じる車に出会っていないからなのでは？」
と思い、
・かわいいやかっこいいというスタイル
・大きさ
・国産か外車か
・アウトドアや街乗りという用途
これらの項目に当てはまる車を、結果として表示するアプリを制作することにしました。
（これらの特徴は全て私が定めているため、投票などにより特徴を決める機能をつけたいです）

# 11月　PHPでアプリ開発
10月からPHPの学習を始めていたので、そのアプリはPHPで制作しました。
カーセンサーAPIを使用して、車の情報を取得します。
解説動画：https://www.youtube.com/watch?v=ZXbgUtjxKM8
![スクリーンショット 2020-12-12 12.34.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706118/29a61c30-2cb1-d917-f94e-ac520b17112a.png)


## 機能
ユーザー登録関連
⚪︎ ログイン
⚪︎ ログアウト
⚪︎ 新規登録
⚪︎ ユーザー件数を表示

車の検索機能
⚪︎ 車の見た目→「かわいい」「かっこいい」「シンプル」「おしゃれ」「レトロ」
⚪︎ 車のサイズ→「ふつう」「すごくおおきい」「おおきい」「ちいさい」
⚪︎ 車の製造国→「国産車」「外車」
⚪︎ 車の用途　→「街乗り」「アウトドア」「スポーツ」

カーセンサーAPI連携
⚪︎ DBにある車情報と合致した車情報を取得
⚪︎ cronでキャッシュファイル自動生成

## 苦労した点
### 検索結果の画像表示高速化
検索の度にAPIからデータを取得していたので、電波の悪い場所では結果の表示に1分以上かかっていました。
そのため、毎日APIからデータを取得するバッチ処理をcronで自動化し、キャッシュ化することで、ユーザーにストレスのない速度で結果を表示させることができました。
### EC2へデプロイ
公式ドキュメントを参考にしデプロイしました。
その際、インフラの知識が不足していたため、デプロイに一週間以上かかりました。

# APIのサービス終了！！
転職活動を始めようとした際、<font color="Red">__一週間後にカーセンサーAPIサービスが終了する__</font>と知りました。
急いで提供元へ問い合わせたところ、
__「完全に提供が終了すること」「24時間以上のキャッシュデータの保有も禁止」__、ということを告げられました。
その後、他の車データAPIの提供元を調べましたが他にありませんでした。
画像だけでもどうにかならないかと思い、ト◯タや◯産などの画像利用規約を確認しましたが、
営利目的ではない&提供元のURLなどの情報を記載する
としても、__利用は禁止__でした。
そのためLaravelの勉強も兼ねて、画像問題を解決できるアプリの制作に取り掛かりました。

# 1月　Laravelでアプリ開発
12月末からLaravelの学習を始め、1月からアプリの制作に取り掛かりました。
## 前回のPHPで制作したポートフォリオとの違い
画像の取得にAPIを用いていましたが、ユーザーから愛車の画像を提供してもらう方針に変更し、機能の追加などを行いました。
## 完成
アプリのURL：https://pf-kurushira.com
(スマホサイズにも対応しています)
![スクリーンショット 2021-03-14 16.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706118/cd6e0c33-ab96-abbe-e01c-9ca77794ccd2.png)

## 使用技術
### 使用言語
  ⚪︎ HTML
  ⚪︎ CSS
  ⚪︎ SCSS
  ⚪︎ PHP 7.4.14
  ⚪︎ Laravel 6.20.11

### インフラ
  ⚪︎ Github Actions 自動デプロイ
  ⚪︎ Docker 20.10.2 / docker-compose 1.27.4
  ⚪︎ nginx 1.18
  ⚪︎ mysql 5.7.31 / PHPMyAdmin
  ⚪︎ AWS ( EC2, ALB, ACM, S3, RDS, Route53, VPC, EIP, IAM)

## インフラ構成図
<img width="844" alt="スクリーンショット 2021-02-28 20 11 32" src="https://user-images.githubusercontent.com/71020018/109416373-2fc61a00-7a01-11eb-8782-eabaf5aaf0ea.png">

## 機能一覧
|機能  |概要  |
|---|---|
|ユーザー管理機能  |新規登録・ログイン・ログアウトができます  |
|簡単ログイン機能  |ログイン画面のゲストログインをクリックすることで、ゲストユーザーとしてログインできます  |
|おすすめ車種検索機能 |条件を選択すると、それにあった車種一覧を表示します  |
|検索履歴機能  |直近の検索履歴・結果を表示します  |
|画像提供機能  |ユーザーの所有している車の画像を提供できます  |
|提供した画像の削除機能  |提供した画像を削除できます  |
|提供画像一覧表示機能  |自身が提供した画像一覧を表示します。  |
|ユーザー情報編集機能  |ご登録いただいたユーザー名・メールアドレスを変更できます  |
|Twitterシェア機能  |車の検索結果をツイートすることができます  |
|レスポンシブ機能  |スマホサイズ(320~540px)にも対応しています  |

## DB設計
<img width="546" alt="スクリーンショット 2021-02-20 19 05 58" src="https://user-images.githubusercontent.com/71020018/108591954-af733980-73ae-11eb-874e-4dda7f4e4865.png">

### 各テーブルについて
|テーブル名  |説明  |
|---|---|
|users  |登録ユーザー情報  |
|cars  |登録車情報  |
|histories |直近の検索結果の情報  |
|car_images |提供画像の情報  |

## 苦労した点
###ユーザー情報編集ページのバリデーション
LaravelのAuth機能のバリデーションを使いまわそうとしましたが、ブラックボックスになっていて苦労しました。
→新しくバリデーションを作成。
###S3からオブジェクト削除 
画像の削除機能でDBからだけでなく、S3からもオブジェクトを削除する必要があり苦労しました。
→解決方法を記事にしました
[laravel6でS3に画像アップロード&削除](https://qiita.com/ohmoto_2020/items/8cd92e08be5a28d8a053)

# 参考にした学習教材など
### PHP/Laravel
・[【Udemy】PHP+MySQL（MariaDB） Webサーバーサイドプログラミング入門](https://www.udemy.com/course/php7basic/)
・[【書籍】詳細！PHP 7+MySQL 入門ノート](https://www.amazon.co.jp/dp/B01HO61ZY2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
・[【書籍】PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=asc_df_4798060992/?tag=jpgo-22&linkCode=df0&hvadid=407434630521&hvpos=&hvnetw=g&hvrand=12084751900863575668&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009645&hvtargid=pla-877192019274&psc=1&th=1&psc=1)
・[【書籍】PHPフレームワーク Laravel実践開発](https://www.amazon.co.jp/dp/B07WW45Q1X/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
・[Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る](https://note.com/mukae9/n/n12cc13fd4f90)

### AWS
・[【Udemy】AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)

### Docker
・[【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://www.udemy.com/course/aws-and-infra/)

# さいごに
生のPHPでひとつPFを制作したのは、基礎力が身についたので良かったと思います。
今回ポートフォリオ完成を優先したため、ECSではなくEC2へデプロイしました。
まだ課題も多いですが、ブラッシュアップしていきたく思っています。
長くなりましたが、ここまで読んでくださりありがとうございました！！