【随時更新】cakephp3について

#index以外へのアクセス方法

極論モデルはデータベースを使わない場合であれば不要だし、ビューについてもきちんとしたデザインがいらないのであれば、controllerを用意するだけで、表示することができます。

下記サンプルですが、
コントローラクラス内に、メソッドが用意されていれば、その名前に指定したアドレスにアクセスすることができます。

このotherは<font color="Red">アクション</font>と呼ばれます。
例：helloコントローラの【other】アクションを呼ぶ。
また、アクションによって呼び出されたメソッド(　例：public function other()…　)を<font color="Red">アクションメソッド</font>といいます。

```HelloController.php
<?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ページです";
		}
	}
```

#アクションの設定とリダイレクト
プログラム内で特定のアクションに移動したい場合に使用するかと思います。
大きく分けて、２通りあります。
<font color="Red">※class HelloController extends AppController　のように、AppControllerに継承することを忘れないように</font>

##アクションの設定（フォワード）
```
$this->setAction(アクション名);
```

##リダイレクトの実行
```
$this->redirect(移動先アドレス);
```

フォーワードは、サーバー側のプログラム内で別のページに移動させるものです。(つまり、サーバー側に用意されていないファイルを参照することはできない。)
リダイレクトというのは、ブラウザに対して、別のページに移動するように指示するものです。

<font color="Red">つまり、例えば、indexアクションとotherアクションがあり、indexからotherへ移動させる場合、フォワードではブラウザのアドレスバーに表示されているアドレスはindexのままでですが、リダイレクトではotherに変更になります。</font>

#ControllerとViewで分けた記述方式

先程説明したControllerだけで記述したものは、とても極端な例になります。
下記のようにCVと分けて書くことのほうが、可動性と可読性が高いということからCakePHPを使用するメリットになります。

```src/Controller/HelloController.php
<?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;
		}
	}
```

```/src/Template/Hello/index.ctp
<!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のコンテンツの中身を引っ張る方法の一例になります。

```src/Template/src/template/layout/hello.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>
```