HelloWorldとechoしてもPHPと友達になれなかったから、フレームワークでやってみるMVC(2)Cakephp
大意は前回書いたので長々とは書かないが、せっかくなのでControllerからViewへの連携や、ルーティングにも触れながらHelloWorldをやって、やや骨太のHelloWorldになってもらおうじゃないかということだ。
(単純にフレームワークに触れてみたいだけだったりするのは内緒)
CakePHP
前回同様、プロジェクト作成については出来ているものとします。
早速ですが、下記の2ファイルを手動で作成しました。
src/Controller/HelloController.php
<?php
namespace App\Controller;
class HelloController extends AppController {
public function index() {
$this->set('message', 'Hello World !! - CakePHP');
}
}
templates/Hello/index.php
<h1><?=$message ?></h1>
CakePHPは、ファイル名やアクションの命名規則のみで、URLのルーティングを行えるのも特徴の1つのようだ。上の記述をするだけで、
- http://localhost:8765/Hello/ にアクセスすると、HelloControllerのindexアクションの処理が行われ、templates/Hello/index.phpビューが呼び出され画面表示される
ということが実現出来る。面白いですね。これは用途などによって、使い方は様々だと思うので、明示的にビューを指定したり、ルーティングをコントロールすることも出来るだろう。(会社などで開発する場合は、明示的に書くほうが好み)
ブラウザ確認
# プロジェクトフォルダで起動
bin/cake server
# ブラウザ確認
http://localhost:8765/Hello/
無事に表示はされましたが、なにやら自動でレイアウトが付与されている。そのあたりを調べてみる。
レイアウトを変更してみる
レイアウトはデフォルトではtemplates/layout/default.phpが適用されているようなので、変更してみる。templates/layout/hello.phpを作成する
templates/layout/hello.php
<!DOCTYPE html>
<html>
<head></head>
<body>
<?= $this->fetch('content') ?>
<p>Cakephp4で遊ぶ</p>
</body>
</html>
急遽レイアウト変更する作業を行ったので、ビューファイルの方にh1タグが入っている、なんとも変な形になったが、やることは同じなので、このまま。(雑
src/Controller/HelloController.php
<?php
namespace App\Controller;
class HelloController extends AppController {
public function index() {
// レイアウトの設定
$this->viewBuilder()->setLayout('hello');
$this->set('message', 'Hello World !! - CakePHP');
}
}
レイアウトの指定をするようにしてみました。再度確認してみます。
ルーティングを変更してみる
命名規則だけでルーティング出来るのは便利だが、とはいえ自分で自由に設定したいので最後に試してみる。現状では/Hello/で呼び出しする必要があったので、/で呼び出せるように変更してみる。
config/routes.php
デフォルトでいろいろと書いてあったので、全部消して以下にしてみた。
<?php
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
Router::connect('/', ['controller' => 'Hello', 'action' => 'index']);
無事に、http://localhost:8765/ のみで、表示させることが出来た!
さいごに
Cookbookも昔はもっとのっぺりした感じだったのに、ずいぶんとシュッとしたイケメンに。Cookbook
思いがけずレイアウトファイルまで触ってしまい、HelloWorldの枠をはみ出してしまった。CakePHPを触るのは本当に久しぶりで、昔との違いで少し手がとまる場面もあったが、無事に表示できた。
次回のターゲットはどいつなのか。それではまた。