第10回に紹介したWepアプリケーションフレームワークのCakePHPに第12回に作成した期末課題のデータベースを組み込む。
今回の作業項目:
CakePHPのインストールと設定
bakeコマンドによるCRUDの構築
次回の作業項目:
データベースのビューの作成とCakePHPへの組み込み
CakePHPを以下の手順でインストールする。
ステップ1a
レポートフォルダの データベース から演習用のファイルをコピーして使用する。
レポートフォルダ → 小橋 一秀 → データベース →
cms3123888.zip
を
T:\xampp\htdocs
にコピーする。
※第10回にコピーしたファイルが残っていれば再利用できる。このステップをスキップしてもOK
ステップ1b
T:\xampp\htdocsの cms3123888.zip を右クリックして「すべて展開」を選ぶ
展開先フォルダを T:\xampp\htdocs に修正
「展開」を押す
ファイル数と容量が大きいので展開が完了するまでしばらく待つ。
注意:第10回に作成したcms3123888フォルダをコピーすると障害が発生する。必ずZIPの展開からやり直すこと
ステップ1c
展開してできたフォルダの名前を第12回で作成したデータベース名(学籍番号+データベース名)に修正する
例) 3123888boardgame_rental
※ 先頭の cms は不要
データベース名の変更が必要な場合:
日本語のデータベース名(全角文字)を使用している場合はアルファベットと数字と‗の名前に変更する。データベースが破損したりCakePHPとの連動に支障が出る。
変更方法:
phpMyAdmin ホームアイコン → データベース → データベース選択 → 操作 → データベース名の変更
ステップ2
PHPの設定ファイル php.ini を編集し国際化対応モジュール intl を有効にする。
※第11回に設定済みの場合はこのステップをスキップする
VS Code で T:\xampp\php\php.ini を開いてphp.ini の934行目を編集
;extension=intl
先頭の ;だけを1文字削除してファイルを保存する。
xampp-controlからWebサーバーを再起動すると設定変更が有効になる。
ステップ3a
XAMPPのphpMyAdimからCakePHP用のデータベースを作成する
※第12回に作業済みの場合はこのステップをスキップする
データベース「学籍番号+データベース名」を新規作成
※データベース名に空白など余分な文字が入らないように注意。
例) 3123888boardgame_rental
ステップ3b
phpMyAdminのSQLタブからテーブル定義SQLを実行する。
※第12回に作業済みの場合はこのステップをスキップする
第12回で作成したデータベースの例
確認ポイント
データベース名 テーブル名 フィールド名 は 小文字 を使う。大文字を小文字に直す(大文字はCakePHPの挙動に影響するので)。
テーブル名 英単語を用いる・複数形にする・空白を含めない(単語の区切りは「 _ 」アンダースコアを用いる)
フィールド名 主キーは id
主キーが複合キーの場合は テーブル名_id と テーブル名_id の組合せ
フィールド名の外部キーは テーブル名の単数形_id
全てのテーブルに主キーが存在
外部キーは参照元のテーブルに外部キー制約を持つ
テーブルやフィールドの名前で予約語は使わない
予約語の例)
action as by char character class condition date datetime enable for from group index label limit list
match new option order release return select setting use value where year
第12回資料に掲載したデータベース
テーブルの修正が必要な場合は、テーブルを選択して構造タブから変更するフィールドをチェックして変更をクリックする
games テーブルで name フィールドを title フィールドに修正する例)
CakePHPでは name と title というフィールドをレコード表示(選択メニューや見出しで使用)に使用する。
それ以外のフィード名を見出しに指定するにはCakePHPのモデルのPHPコードを修正して対応する。
主キーが複合キーのテーブル articles_tagsテーブルをもつデータベース(第10回のcmsチュートリアル)
中間テーブルの名前 アルファベット順でテーブル名を並べる。
第11回資料に掲載したデータベース
テーブル間に外部キー制約が設定されていない場合は修正が必要。
データベースのデザイナ画面のコネクタを利用して修正する場合は、
テーブルの構造から参照先に予めキー(主キーではない。設定すると銀の鍵マークが付く)を設定しておく。
間違った参照のリンクはデザイナ画面のリンクをクリックして表示されるメニューから削除できる。
または以前の演習同様にテーブルの構造タブのリレーションから設定を追加・削除する。
デザイナ画面で外部キー制約を修正する例
テーブルのリレーションの設定・削除の操作例
ステップ4a
vscode のメニューから作業フォルダを設定する
File→ Open Folder → T:\xampp\htdocs\3123888boardgame_rental
ステップ4b
データベース接続設定ファイルapp_local.phpを編集
config/app_local.php
database の設定は「3123888boardgame_rental」の様に自分の期末課題のデータベース名を記入する。
編集後に保存する。
ステップ5
XAMPPコントーロールのShellボタンを押してコマンドプロンプト(shell)を開く
コマンド プロンプト が開く。
入力補助機能
Tabキー ファイルやフォルダ名を補完入力
上下矢印キー コマンド入力履歴
以下のコマンドを入力する。太字部分のフォルダ名は自分の期末課題に合わせる
cd htdocs\3123888boardgame_rental
ステップ6
各テーブルに対するMVCのCakePHPのコードとCRUD(templates\テーブル名\index.php や add.phpなど)を自動生成する。
usersテーブルについてbakeするコマンドの例)
bin\cake bake all users
「Bake All complete」 と表示されていたら成功。失敗した場合は作業手順を見直してやり直す。
注意点:
外部キー制約の参照元のテーブルから bake する。
中間テーブル(articles_tags や boardgames_categariesなど)は bake しない。
ステップ6を必要に応じて繰り返す。
ただし多対多専用の中間テーブルは bake してはいけない。
例)以下のように id フィールドを持たないテーブルはBakeしない。
このタイプのテーブルのデータ入力は以下の例のように関連したテーブルから入力できるようになる。
例)id フィールドを主キーにもつテーブルはBakeする。 データ入力画面を生成する必要がある。
不要なbakeを実行したら、生成したphpファイルやフォルダを全て削除
src/controller/テーブル名Controller.php
src/model/Entity/テーブル名(単数形).php
src/model/Table/テーブル名Table.php
template/テーブル名
トラブル対応でテーブルの bake をやり直す場合には、以下のような「上書きの確認」が表示される。
全て上書きするために「a」を入力してEnterする。
bakeで上書きしても不具合が修正されない場合は、以下のコマンドでcakphpのキャッシュをクリアして、再びbakeを試す。
bin\cake cache clear_all
bakeに関するトラブル対応
症例1
一覧表示でエラーになる
対応
src/Model/Entity/【エラーに対応する○○.php】
src/Model/Table/【エラーに対応する○○Table.php】
src/Controller/【エラーに対応する○○Controller.php】
template/【エラーに対応するフォルダ】
を削除して bake all し直す
bakeに成功していても、この次のステップでレコード一覧表示やレコード書き込み画面を表示した際に不具合が出ることがある。
症例1
一覧表示でエラーになる。
対応
テーブルの主キーはフィールド名 をid に修正してbakeし直す。
主キーが複合キーの場合は、bake model --primary-key key1,key2 の様に指定してbakeし、controller と templateもbakeする。
外部キーが命名規約に従っていない場合は、PHPのModelのコードを修正する。または、命名規約に従う様にテーブル(参照元と参照先)を修正してbakeし直す。
同じテーブルを複数回外部キーとして使用するテーブルの場合はPHPのコードを修正して対応する。
コードの修正方法参照
症例2
外部キーのフィールドが数値で表示される。
対応
テーブルのフィールドで name または title を使用するように修正してbakeし直す。
または、ディスプレイフィールドの設定が必要。次回の第14回で対応。
ステップ7
データベースに動作確認用のデータを書き込む。
以下のURLのデータベース名とテーブル名の部分を受講生各自のものに修正して一覧表示(○○List)のページを表示する。
New ○○からデータを数件追加する。
http://localhost/3123888boardgame_rental/students
他にも幾つかテーブルがあるので同様にしてデータを書き込む。
注意)外部キーをもつテーブルにデータを書き込むには、先に参照元のテーブルにデータを書き込んでおくこと。
例) boardgame テーブルは外部キー maker_id を持つ。先に markerテーブルにデータを登録する。
【重要】URLの記号の自動修正について
CakePHPはアンダースコア「‗」を含むテーブルのコントローラのURLをハイフン「-」に自動的に設定する。
例)usage_records テーブルにアクセスするURLは
http://localhost/3123888boardgame_rental/usage-records
になる。
makersテーブルにレコードを登録した例
boardgamesテーブルにレコードを登録した例
先に登録したmakerを選択メニューから選んでデータを入力できた。
categoriesテーブルにレコードを登録した例
boardgamesのリストから view をクリックしてボードゲームの登録詳細の画面を表示した例
Related Categoriesに関連カテゴリが表示されている。
この部分は中間テーブル boardgames_categories からCakePHPが自動的に作成している。
関連カテゴリが未登録の場合、ここは空欄になる。
boardgamesのリストから edit をクリックしてボードゲームの登録内容の修正画面を表示した例
Related Categoriesに関連カテゴリが表示されている。
スクロールしてクリックでカテゴリを設定できる。
usage_recordsテーブルにボードゲームの貸し出し状況を記録した例
「_」を含むテーブル名なのでURLが /usage-records とハイフンに変わることに注意する。
機能確認:
・リストの見出し「Id」や「Student」をクリックすると表示が並び変わる。
・登録件数が多くなり1ページに表示できなくなるとページネーション機能によりリストはページに分けられる。prev 前 next 次 でページを移動できる。
今回の提出物はない。
XAMPPのWebサーバとMySQLをSTOPしてコントロールパネルをQuitしてからPCをシャットダウンすること。
念のためにhtdocsの学籍番号+データベース名のフォルダをコピーしてバックアップしておくとよい。
残りの時間で以下の課題に取り組む。追加点用の課題とする。第11~15回の演習で時間の余裕があるときに取り組んでおくこと。