CakePHP5入門【CakePHP5基礎編③】MVC
B美
A子
…って、何?
C菜
B美
・Model
・View
・Controller
の三つの頭文字を並べて「MVC」ね
A子
B美
Webフレームワークって「MVC」パターンで作られていることが多いんだけど、「CakePHP」もそうだからね
要するに、「CakePHP」を学ぶには「MVC」を理解する必要があるってわけ
C菜
A子
B美
というか、めちゃくちゃ便利な仕組みだからね
まずブラウザからアクセスするのは、Controller(の役割を担うクラス)のメソッドよ
C菜
B美
ControllerがWeb処理の中核ね
んで、その中では(必要に応じて)Modelにアクセスするの
A子
B美
なぜならModelの役割は「データベースアクセス」だからね
データベーステーブルへの読み書きを行わないのであれば、Modelは必要ないわ
C菜
B美
Controllerのメソッドに対応するViewファイルをあらかじめ作っておいて、ブラウザにレスポンスされるのはそのViewファイルってことになるわね
もちろん、ControllerからViewへ値(処理結果)を受け渡すこともできるわよ
A子
B美
(まさに「習うより慣れろ」ね)
それじゃ、いつものように「MATE端末」を開いて次のように入力してね
cd html/testapp[Enter]
bin/cake bake controller PostTest[Enter] |
これによって新たなControllerである「PostTestController.php」が自動生成されるわ
(「PostTest」の部分は自由だけど、その名前の付け方は「パスカルケース」でお願いね)
注:「○○ケース」という記法に関しては【コラム③】を参照のこと
B美
ホームディレクトリから「html」→「testapp」→「src」→「Controller」とたどってね
↓
↓
↓
↓
A子
B美
↓
C菜
B美
「index」メソッドだけは残してね
(その中身は削除してもOK)
あ、あとすでに気付いているとは思うけど、「/*」から「*/」まではコメントだからね
A子
これって「PostTestController」クラスがあって、その中に「index」メソッドがあるってことでしょう?
B美
それじゃ次はViewを作りましょう
「testapp」ディレクトリの中に「templates」というディレクトリがあるから、それを表示してね
んで、右クリックしてから「フォルダの生成」を選んで、名前を「PostTest」にします
↓
B美
ファイル名を「index.php」にします
(これがViewファイルよ)
↓
C菜
B美
いい勘してるー
それじゃ、ブラウザを起動してURLには「localhost/testapp/PostTest」と入力してね
A子
さっきの「index.php」って、まだ中身は空っぽよね?
なんで上のほうにタイトルっぽいものが出てるの?
B美
あの中に「default.php」というファイルがあるんだけど、その内容がブラウザ上に表示されてるってわけ
(正確には、「default.php」の中に「index.php」の中身が埋め込まれる)
C菜
ということは~
Webページの外枠というか、全体のデザインを「default.php」で決めて~
個別のコンテンツについては、メソッドで処理したものをViewファイルで表示するってことでしょうか~?
B美
理解が早くて助かるわ
あ、ちなみにデフォルトのレイアウトは「default.php」なんだけど、別のレイアウトファイルを作って、ページによって切り替えて使うなんてこともできます
A子
あ、そういえば、さっきのURLってメソッド名(index)を指定しなかったよね?
B美
言い換えれば、メソッド名を省略した場合は自動的に「index」メソッドが指定されたものとみなす…ってこと
C菜
最後はModelですねぇ~
B美
そこに次のように入力してちょうだい
bin/cake bake model Counters[Enter] |
あ、さっきのコントローラーと同様、「testapp」ディレクトリ上で実行してね
(事前に「pwd」を打ち込んで、カレントディレクトリを確認すること)
A子
これってエラー?
めっちゃ赤いんだけど…(苦笑)
B美
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p[Enter] |
上記のコマンドを叩いたら(MariaDBの)rootパスワードを入力してね
(Linuxのrootパスワードじゃないわよ)
B美
bin/cake bake model Counters[Enter] |
A子
で、結局「mysql_tzinfo_to_sql」って何だったのよ
意味不明なんだけど…
B美
でもね、MariaDBにはそのタイムゾーンが用意されていないのよ
なので、システム(Linux)に最初から用意されているタイムゾーンをMariaDB側にロードした(読み込んだ)ってわけ
あ、これって別にプロジェクトごとに毎回実行するわけじゃないからね
(一つのOSにつき、一回だけやればOKだから…)
C菜
B美
そ、そうよ
いや、でもこれって忘れるよね?
A子
B美
これによって「testapp/src/Model/Entity」の中に「Counter.php」が
「testapp/src/Model/Table」の中に「CountersTable.php」が作られたってわけ
B美
「testapp/src/Controller」の中にある「PostTestController.php」を開いてね
クラスのフィールドとして「$Counters」を追加します
class PostTestController extends AppController
{ private $Counters; |
新たなメソッドとして「initialize()」を記述します
public function initialize(): void
{ parent::initialize(); $this->Counters = $this->fetchTable('Counters'); } |
「index」メソッド内に以下のコードを入力します
public function index()
{ $counters = $this->Counters->find()->where(['id' => 1])->first(); $this->set('count', $counters); } |
↓
B美
必ず最初に実行されるメソッドが「initialize()」と決まっていて、その中で「counters」テーブル(のModelへの参照)をprivateフィールドの「$Counters」に代入したの
これにより「$this->Counters」という形で、「counters」テーブルへの読み書きがModel経由で行えるようになったってわけ
あ、「$this->set()」はControllerからViewへ値を受け渡すやり方よ
A子
B美
んじゃ、次は「testapp/templates/PostTest」の中にある「index.php」の中身を記述しましょう
<?php
echo $count['remarks']."の値は".$count['counter']; ?> |
上のコードで分かると思うんだけど、データベースアクセスした結果は連想配列として取り扱うってことね
↓
A子
(赤い矢印で指したところ)
C菜
B美
「remarks」の値である「top」と「counter」の値である「0」がビューファイルに埋め込まれたってわけ
あ、ちなみにControllerから渡された値を表示するときは、echoを使わずに次のように記述しても良いわよ
(というか、普通は下記のように記述します)
<?= $count['remarks']."の値は".$count['counter']; ?> |
ちなみに、Modelのファイル(「testapp/src/Model/Entity/Counter.php」及び「testapp/src/Model/Table/CountersTable.php」)を全くいじっていないのに、テーブルの項目名を連想配列のキーワード('remarks'や'counter')として使っている(いえ、使うことができている)のがすごいでしょ?
A子
B美
A子
C菜
ちなみに、細かい説明はまた後日ですか~?
B美
あくまでも今回は「MVC」の話だからね
(全体像を把握してほしいってだけだから)