
マイケル
どうもみなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜〜!!

マイケル
今回は前回に引き続き、
自動販売機システムを作っていきます!
自動販売機システムを作っていきます!

エレキベア
前回はテーブル作成までだったクマね

マイケル
うん!
ここから実際に画面をつくっていくぞ!
今回はメンテナンス画面の作成です!!
ここから実際に画面をつくっていくぞ!
今回はメンテナンス画面の作成です!!
参考書籍

マイケル
基本的な実装方法などは、
前回に引き続きこちらを参考にして進めていきます。
前回に引き続きこちらを参考にして進めていきます。

エレキベア
やったるクマ〜〜〜〜!!
メンテナンス画面の仕様

マイケル
復習になりますが、
メンテナンス画面の仕様は以下の通りです!
メンテナンス画面の仕様は以下の通りです!
↑自動販売機:メンテナンス画面
↑juiceテーブルの構成

マイケル
juiceテーブルのマスタメンテナンス画面となっており、
前レコードの登録・検索・更新・削除の処理が行えるようになっています!
前レコードの登録・検索・更新・削除の処理が行えるようになっています!

エレキベア
いわゆるCRUDシステムというわけクマね
CRUDとは
- 主にデータベース管理システムについて用いられ、
Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)の機能のことである!

マイケル
その通り!
CRUDはWEBアプリの基本だね!
CRUDはWEBアプリの基本だね!

マイケル
この画面を使うと、以下のように画面上でテーブル内容の編集ができます。

エレキベア
これは楽しみクマね〜〜〜〜
メンテナンス画面の開発

マイケル
今回作るのは下記の赤枠の範囲です!
MVCモデルの定義に沿って、Model、View、Controllerの各内容を紹介していきます!
MVCモデルの定義に沿って、Model、View、Controllerの各内容を紹介していきます!

エレキベア
やったるクマ〜〜〜!!
ところでMVCモデルって何クマ??
ところでMVCモデルって何クマ??

マイケル
MVCモデルはWEBアプリケーションの考え方の一つで、
・Model → DBデータのやり取り
・View → 画面の表示
・Controller → Modelの操作やViewの表示等、処理を制御する
といった役割に分けて作成する考えなんだ!
・Model → DBデータのやり取り
・View → 画面の表示
・Controller → Modelの操作やViewの表示等、処理を制御する
といった役割に分けて作成する考えなんだ!

エレキベア
なるほどクマね〜〜
LaravelはMVCモデルを採用してるのクマね
LaravelはMVCモデルを採用してるのクマね

マイケル
そういうことだ!
さっそく見ていこう!
さっそく見ていこう!
Model

マイケル
まずはDBデータのやり取りを行うために、
下記コマンドでjuiceテーブルのModelクラスを作ります!
下記コマンドでjuiceテーブルのModelクラスを作ります!
↑juiceテーブルのModelクラス作成

マイケル
するとappフォルダ配下にファイルが作成されるため、
$table -> テーブル名
$primaryKey -> 主キー項目名
を記述します!
$table -> テーブル名
$primaryKey -> 主キー項目名
を記述します!
↑テーブル名、主キーを設定

エレキベア
$guardedは何の設定クマ?

マイケル
$guardedはModelクラスを使って更新を行うときに、
値を反映しない項目を定義するんだ!
値を反映しない項目を定義するんだ!

マイケル
今回の場合だとIDは自動インクリメントで設定されるから、
更新項目として設定する必要がないわけだからね。
更新項目として設定する必要がないわけだからね。

エレキベア
そういうことクマね
Modelクラスは簡潔でわかりやすいクマ
Modelクラスは簡潔でわかりやすいクマ
View

マイケル
Modelを作成したら次はViewの作成だ!
Laravelでは Blade というテンプレートエンジンを使用して記述することができます!
Laravelでは Blade というテンプレートエンジンを使用して記述することができます!

マイケル
app/resources/views配下に下記フォルダ・ファイルを作成しましょう!
■ juiceapp.blade.php
格納先:app/resources/views/layouts
格納先:app/resources/views/layouts
■ index.blade.php
格納先:app/resources/views/edit
格納先:app/resources/views/edit
・セクション機能による継承

エレキベア
どうして1画面なのに2つのファイルに分かれてるクマ?

マイケル
Bladeでは「セクション」という機能を使うことで
ページを継承して作成することができるんだ!
ページを継承して作成することができるんだ!

マイケル
書き方は下記のように
継承元で @yield を指定した箇所に対して
継承先で @section で設定する
ような使い方をするよ!
継承元で @yield を指定した箇所に対して
継承先で @section で設定する
ような使い方をするよ!

エレキベア
これで簡単にテンプレートが作れるというわけクマね

マイケル
そういうことだ!
システム全体で共通の構成がある場合はこうして作っておくと
他の画面の記述量も減るし、統一感もでるんだ!
システム全体で共通の構成がある場合はこうして作っておくと
他の画面の記述量も減るし、統一感もでるんだ!

エレキベア
これは便利クマ
・データの登録

マイケル
データの登録エリアはこんな感じ!
入力エリアとformのアクションを記述しています!
入力エリアとformのアクションを記述しています!

エレキベア
大体一般的なHTMLの記述クマね
「{{old(‘XXX’)}}」と書かれているのは何クマ?
「{{old(‘XXX’)}}」と書かれているのは何クマ?

マイケル
そこはControllerの実装で説明する入力チェックの時に、
エラーの場合にも入力値を残すための記述なんだ!
エラーの場合にも入力値を残すための記述なんだ!

エレキベア
これがないと値が消えてしまうクマね

マイケル
それから画像の登録も行うため、
formには enctype=”multipart/form-data” も記述しているよ!
formには enctype=”multipart/form-data” も記述しているよ!
・データの表示と更新

マイケル
そしてデータの表示と更新処理は以下のような感じになっています!

マイケル
Controllerから $juice_list 変数で受け取って、
for文で回して出力しています!
for文で回して出力しています!

マイケル
また、行ごとに更新処理を行うため、formも行ごとに定義しています。

エレキベア
画像の表示部分だけ少し複雑クマね

マイケル
それは、base64で保存されている画像データを表示するために
src=”data:image/jpeg;base64,{{$juice->ju_image}}”
といった形で記述しているんだ!
src=”data:image/jpeg;base64,{{$juice->ju_image}}”
といった形で記述しているんだ!

エレキベア
画像表示は一手間いるわけクマね
Controller

マイケル
そして最後にViewとModelを繋ぐControllerの作成だ!
下記コマンドでクラスを作成して処理を記述しましょう!
下記コマンドでクラスを作成して処理を記述しましょう!
↑EditControllerクラスの作成

マイケル
index()メソッドが初期表示処理、
edit()メソッドが更新処理になるよ!
edit()メソッドが更新処理になるよ!

エレキベア
edit()メソッドはごちゃごちゃ書かれてるクマね

マイケル
これはリクエストで受け付けた後に、
submitの名前で処理を分岐しているからなんだ!
submitの名前で処理を分岐しているからなんだ!
↑POSTリクエストでの処理分岐

エレキベア
なるほどクマ
POSTリクエストの中に、送信元のsubmitボタン名が
含まれてるかどうか見ているクマね
POSTリクエストの中に、送信元のsubmitボタン名が
含まれてるかどうか見ているクマね

マイケル
その通り!
こうすることでformの中で複数の処理を行うことができるんだ!
こうすることでformの中で複数の処理を行うことができるんだ!

マイケル
そしてModelクラスを使用したCRUD処理の部分は下記になります。
↑CRUD処理の実装(抜粋)

エレキベア
ここも画像ファイルの部分だけ一手間加えてるクマね

マイケル
これも先ほどと同じで、base64に変換しているからだね。
それ以外の項目は基本的にリクエストから取得してそのまま登録・更新しているよ!
それ以外の項目は基本的にリクエストから取得してそのまま登録・更新しているよ!

エレキベア
これだけでDB処理が行えるのは便利クマね
・Routeの設定(下部2行を追加)

マイケル
Controllerに記述した処理を呼ぶために、
routes フォルダ内の、 web.php ファイルを修正します!
routes フォルダ内の、 web.php ファイルを修正します!
↑Routeの設定

マイケル
こうすることで、
「/edit」のGETリクエストの場合にはindex()メソッドが、
POSTリクエストの場合はedit()メソッド
が呼ばれるようになります!
「/edit」のGETリクエストの場合にはindex()メソッドが、
POSTリクエストの場合はedit()メソッド
が呼ばれるようになります!

マイケル
試しに
http://【サーバアドレス】/edit
でアクセスしてみると画面が表示されるはずです!
http://【サーバアドレス】/edit
でアクセスしてみると画面が表示されるはずです!

エレキベア
画面が表示されたクマ〜〜〜〜
・バリデーションの実装

マイケル
そして次はバリデーションを実装します!
これはViewとCotrollerの間に挟まる、
FormRequest というクラスを作成することで簡潔にチェックすることができます!
これはViewとCotrollerの間に挟まる、
FormRequest というクラスを作成することで簡潔にチェックすることができます!

マイケル
FormRequestクラスを下記コマンドで作成し、
処理を記述しましょう!
処理を記述しましょう!
↑EditRequestクラス作成

マイケル
それぞれ、
・authorize()メソッド -> チェックするパスの定義
・rules()メソッド -> チェック内容の定義
・messages()メソッド -> エラーメッセージの定義
を記述します!
・authorize()メソッド -> チェックするパスの定義
・rules()メソッド -> チェック内容の定義
・messages()メソッド -> エラーメッセージの定義
を記述します!
↑チェックを実施するパスの設定
↑チェック内容の定義
↑エラーメッセージの定義

エレキベア
rules()メソッドだけ
「登録処理のみ画像設定チェックを実施」って書かれているクマね
「登録処理のみ画像設定チェックを実施」って書かれているクマね

マイケル
これは、更新処理の時には画像参照で設定しなくていいように
個別で分岐処理を入れているんだ!
個別で分岐処理を入れているんだ!

マイケル
あとはControllerクラスの引数を「EditRequest」に変更すれば
リクエスト時にはチェック処理が実施されます!
リクエスト時にはチェック処理が実施されます!
↑引数を「EditRequest」に変更する

エレキベア
これだけでいいクマね
エラーメッセージの表示はどうするクマ??
エラーメッセージの表示はどうするクマ??

マイケル
Viewのときに説明していなかったけど、
$errors 変数をチェックすることでエラー有無を判断できるんだ!
$errors 変数をチェックすることでエラー有無を判断できるんだ!

マイケル
だから下記のようにしてあげると
エラーがある場合は処理が中断されてメッセージが表示されるようになるよ!
エラーがある場合は処理が中断されてメッセージが表示されるようになるよ!

エレキベア
これで実装完了クマね!
・文字化けの対処

マイケル
最後に補足ですが、
formに「enctype=”multipart/form-data”」を指定している影響で、
日本語の文字が文字化けする場合があります。
formに「enctype=”multipart/form-data”」を指定している影響で、
日本語の文字が文字化けする場合があります。

マイケル
その場合、 php.ini の文字コード指定を下記のように指定することで解消するはずです!
↑文字コードの設定

エレキベア
文字コードの問題はあるあるクマね〜〜〜

マイケル
ここまででメンテナンス画面の実装は完了です!
思う存分メンテナンスしましょう!
思う存分メンテナンスしましょう!
おわりに

マイケル
・・・と、ここまでざっと実装の解説をしましたが
いかがだったでしょうか?
いかがだったでしょうか?

エレキベア
情報量が多かったクマが
これだけでCRUDシステムが作れるのは楽に感じたクマ
これだけでCRUDシステムが作れるのは楽に感じたクマ

マイケル
分からなかったり、もっと詳細な内容が知りたいと思った方は
参考書・ネット等でがんがん調べてみてくださいね!
参考書・ネット等でがんがん調べてみてくださいね!

マイケル
というわけで次回は最終回(予定)!
メインの購入画面を実装していくぞ!
メインの購入画面を実装していくぞ!

エレキベア
やったるクマ〜〜〜〜!!

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!
【Laravel】第二回 自動販売機システムを作ろう! 〜マスタメンテナンス画面の作成〜 〜完〜