[個人開発] プログラミング学習記録アプリ (Laravel使用)


# はじめに
- ### 自己紹介
　25卒上智大学経済学部のAkiraです。
僕は、(当時大学1年)2021年6月からプログラミングの勉強をはじめ、POSSEという大学生プログラミングコミュニティで運営しつつ学習しながらハッカソンやチーム開発を行っています。


POSSEのリンク先
Instagram：https://www.instagram.com/posse_programming/
Twitter：https://twitter.com/posse_program

- ### 記事の概要
　今回、POSSEコミュニティでカリキュラムの一環として扱われる「プログラミング学習記録アプリ」をWEBフレームワークLaravelを用いて制作しました。
開発目的としては、あくまでもWEBフレームワークの学習なので、MVCモデルへの理解など、学習したことを中心に記事にアウトプットしていきたいと思います。
- ### 想定読者
　・プログラミング初学者
　・エンジニア学生
　・WEBフレームワーク・Laravelに興味がある方
　・ぶっちゃけ誰でもOK


# 目次
1. [MVCモデルとは](#MVCモデルとは)
1. [技術スタック](#技術スタック)
1. [制作物](#制作物)
1. [ER図](#ER図)
1. [機能一覧](#機能一覧)
1. [躓いた点](#躓いた点) 
1. [振り返り](#振り返り)
1. [参考文献](#参考文献)

# MVCモデルとは
はじめに軽くMVCモデルの説明をします。
そもそもMVCモデルとは、Model、View、Controllerのそれぞれの頭文字3文字を表します。PHPのフレームワークLaravelは、以下のアプリケーションの処理を行っています。
- Model・・・DBとのやりとりを行う。
- View・・・Controllerからデータを受け取り、見た目部分を表示する。
- Controller・・・クライアントから受け取るRequestに応じてデータをModelと送受信し、その結果をViewへ渡す。
(Requestに応じるとは、受け取ったRequestをルーティングで処理してからControllerを扱うことを指します。)

　MVCモデルの構造は以下の図の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/517f78c4-98c5-f7bb-c507-1ced69d50b1e.png)











# 技術スタック
- フロントエンド： JavaScript, CSS
- バックエンド　： PHP, Laravel
- DB： MySQL
- 環境： Docker

コミュニティのカリキュラムに沿って行うため、技術選定はありません。
※カリキュラム(企業の場合は研修とか？)は、初心者にとって学習の効率を引き上げる利点はありますが、課題解決などの目的に向かって開発するわけではないため、技術選定やこだわり、工夫などを考える機会は、自発的な開発や長期インターンの実務経験を積む必要があると思われます。


# 制作物
リポジトリはこちら。（ブランチ：main）

https://github.com/akira1515/study-tracker-app/tree/main

制作したものは、ユーザー画面、管理者画面、ユーザー管理画面です。


#### ユーザー画面
![スクリーンショット 2023-03-13 17.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/121c83c2-eb97-babc-14cf-8f563f126a29.png)

gifで学習記録の動作を紹介（登録後、数値やグラフがしっかり更新されます）
![ezgif.com-video-to-gif (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/55037331-2ba6-6cab-18c6-e0181102735d.gif)

#### 管理者画面
WEBフレームワークを扱ったCRUD学習のため、見た目はテキトーですが、データの整合性はしっかり取れています。
![スクリーンショット 2023-03-13 17.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/c2f9ea6b-2836-d8ef-018b-21cdb5eb704f.png)

#### ユーザーリスト管理画面
真ん中にポツンと
![スクリーンショット 2023-03-13 17.33.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/f4b7954b-c50c-1e84-f493-0f9eec365349.png)


# ER図

ER図はこちらになります。

![スクリーンショット 2023-03-13 16.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/603ff6a8-1456-490a-cacb-4c3aa368b76d.png)

ER図からわかること：
- 勉強した言語と勉強したコンテンツを選択せずに勉強時間のみを記録することも可能。
- 勉強した言語と勉強したコンテンツを複数選択することが可能。


# 機能一覧

#### ユーザー画面
- ログイン/新規登録 （ユーザー別に学習記録のデータを管理）
- 学習時間の記録
- 言語、コンテンツの学習記録
- 学習時間を「今日」「今月」「全体」で表示
- 今月の学習時間の棒グラフ表示
- 言語、コンテンツの学習割合の円グラフ表示
- 学習記録を登録時、ツイート機能を設置

※グラフはGoogle Visualization APIを使いました。

#### 管理者画面
- 学習言語、学習コンテンツの項目を新規追加
- 学習言語、学習コンテンツの名前を編集
- 学習言語、学習コンテンツのを削除

#### ユーザー管理画面
- 名前、メールアドレス、パスワードの変更
- ユーザーのアカウント削除

# 躓いた点

私が今回特に記憶に残る躓いた点は2箇所。

- Modelから渡されてきたデータをGoogle Visualization APIに格納させる部分。
→ Eloquentで渡されてきたデータは返り値がオブジェクトなので、一度View内のJSに渡し、json形式に変換した後に配列でAPIに格納させる必要がありました。

- 無限リダイレクトにハマったこと。下の画面が一時期ずっと表示されていました。
![スクリーンショット 2023-02-15 17.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/a3db2fd1-e61b-501a-6b03-1e114fa4e73d.png)

原因は、なぜか下記のように、Auth::routes();がauthのミドルウェアの中で閉じこもっていただけでした。（普通に考えれば当然なことでした。。。）
実際このようなエラーこそ、ルーティングに問題がありそうだなとエラーの原因をすぐに推測できるのがMVCモデルのメリットであると感じました。
![スクリーンショット 2023-03-13 18.35.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533466/ac9e12f7-1973-e2fe-244e-692e5fa61215.png)
「外出時に鍵を持たずオートロックの扉を閉じてしまった感じ笑」


# 振り返り

今回、このwebアプリを制作する上で特に得たこととして、
- GETとPOSTへの理解が深まった。
→ Controllerを扱う上で、webサービスの通信を気にする必要があったから。
- MySQLのテーブル結合と外部キーについて理解が深まった。
→ ユーザーのアカウント別にDBの送受信を選ぶ必要があるから。
- 認証機能におけるミドルウェアについて理解が深まった。
→ 無限リダイレクトにハマったから。

今後、もっと学んだ方がいいこととして、
-  DBとやりとりをする際、ModelとControllerのどちらにメソッドを記述するべきかの判断について。
→今回、fillableの記述以外、ほとんどControllerでメソッドを記述していました。そして、そのことを完成してから疑問として気がつきました。これからメンターさんなどにレビューをお願いしてもらい、理解を深めていきたいと思います。

[追記]
メンターさんからの回答
ModelとControllerのどちらにメソッドを記述するべきか
→ 一人でやる分にはどこに書いても大丈夫。
→ また、設計次第のため、設計思想を学んで自分の書きたいようにやるのが良い。
→ 加えて、共通化できるところがあれば、Modelに書くとか。

# 参考文献

- 「MVCパターンについて」 (Laravel学習帳)
https://laraweb.net/surrounding/922/
- 「Laravelの仕組み~MVCの理解~」(CRI BOOT CAMP)
https://cbc-study.com/training/backend/laravel3