index以外へのアクセス方法
極論モデルはデータベースを使わない場合であれば不要だし、ビューについてもきちんとしたデザインがいらないのであれば、controllerを用意するだけで、表示することができます。
下記サンプルですが、
コントローラクラス内に、メソッドが用意されていれば、その名前に指定したアドレスにアクセスすることができます。
このotherはアクションと呼ばれます。
例:helloコントローラの【other】アクションを呼ぶ。
また、アクションによって呼び出されたメソッド( 例:public function other()… )をアクションメソッドといいます。
<?php
namespace App\Controller;
class HelloController extends AppController {
public $name = "hello";
public $autoRender = false;
// http://ドメイン名/helloに表示される記述
public function index() {
echo "hello world";
}
// http://ドメイン名/hello/otherに表示される記述
public function other(){
echo "こちらはotherページです";
}
}
アクションの設定とリダイレクト
プログラム内で特定のアクションに移動したい場合に使用するかと思います。
大きく分けて、2通りあります。
※class HelloController extends AppController のように、AppControllerに継承することを忘れないように
アクションの設定(フォワード)
$this->setAction(アクション名);
リダイレクトの実行
$this->redirect(移動先アドレス);
フォーワードは、サーバー側のプログラム内で別のページに移動させるものです。(つまり、サーバー側に用意されていないファイルを参照することはできない。)
リダイレクトというのは、ブラウザに対して、別のページに移動するように指示するものです。
つまり、例えば、indexアクションとotherアクションがあり、indexからotherへ移動させる場合、フォワードではブラウザのアドレスバーに表示されているアドレスはindexのままでですが、リダイレクトではotherに変更になります。
ControllerとViewで分けた記述方式
先程説明したControllerだけで記述したものは、とても極端な例になります。
下記のようにCVと分けて書くことのほうが、可動性と可読性が高いということからCakePHPを使用するメリットになります。
<?php
namespace App\Controller;
class HelloController extends AppController {
// クラス全体に適用される設定 initializeメソッドはクラスのインスタンスが作成される際に自動的に呼び出される
public function initialize(){
$this->name = 'Hello';
$this->autoRender = false;
$this->viewBuilder()->autoLayout(false);
}
public function index(){
//レイアウト機能を使った自動レイアウトをONにする
$this->viewBuilder()->autoLayout(true);
//src/Template/Helloファルダの中にある、テンプレートを読みこんでページを表示させる
$this->$autoRender = true;
}
public function other(){
$this->viewBuilder()->autoLayout(false);
$this->autoRender = true;
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Hello Page</title>
<link rel="stylesheet" href="">
</head>
<body>
<h1>サンプル見出し</h1>
<p>こんにちは!これはCakePHPのサンプルです</p>
</body>
</html>
setによる変数の設定
$this->set(変数名,値);
例:$this->set('msg','メッセージ');
エレメントの利用
<?=$this->element(エレメント名,[キー=>値,キー=>値,...]) ?>
例:$メッセージという値が格納されている$msgが用意される
<?=$this->element('Hello/header',['msg'=>'メッセージ']); ?>
下記は、webroot/cssフォルダのアクセス方法
Template/Hello/index.ctpのコンテンツの中身を引っ張る方法の一例になります。
<!DOCTYPE html>
<html>
<head>
<?=$this->Html->charset(); ?>
<title><?= $this->fetch('title'); ?></title>
<?php
// cssメソッドを呼び出し、/webroot/cssフォルダへアクセスする
echo $this->Html->css('cake.hello');
// cssメソッドを呼び出し、/webroot/jsフォルダへアクセスする
echo $this->Html->script('cake.hello');
// fetchの呼び出し CakePHPのシステムで用意されているmetaタグ/スタイルシート\JavaScriptスクリプトの読み込みタグを生成している
echo $this->fetch('meta');
echo $this->fetch('css');
echo $this->fetch('script');
?>
</head>
<body>
<div id="container">
<div id="header">
<?=$this->element('Hello/header',['msg'=>$msg]) ?>
</div>
<div id="content">
<!-- viewテンプレートをレンダリングした結果が出力される -->
<?=$this->fetch('content') ?>
</div>
<div id="footer">
<?=$this->element($footer) ?>
</div>
</div>
</body>
</html>