LoginSignup
6
4

More than 5 years have passed since last update.

【随時更新】cakephp3について

Last updated at Posted at 2017-08-04

index以外へのアクセス方法

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

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

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

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ページです";
        }
    }

アクションの設定とリダイレクト

プログラム内で特定のアクションに移動したい場合に使用するかと思います。
大きく分けて、2通りあります。
※class HelloController extends AppController のように、AppControllerに継承することを忘れないように

アクションの設定(フォワード)

$this->setAction(アクション名);

リダイレクトの実行

$this->redirect(移動先アドレス);

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

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

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>
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4