Help us understand the problem. What is going on with this article?

【随時更新】cakephp3について

More than 1 year has passed since last update.

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>
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした