開発者の備忘

「起」と「結」しか書かないので詳細はご自分でお調べください

【PHP】Viewに渡した値をどこで使用するかの判定条件は?

◆概要


いま、改めて考えてみるとすごく簡単なこと。

Controllerから"set"メソッドで渡した値が
なぜViewの特定の箇所で使用されるのか理解できなかった。


例えば、以下のような場合、Controllerから「$posts」という引数を渡してあげると
8行目に渡されてforeachで使用される。

<?php
  $this->assign('title', 'Blog Posts');
 ?>

<h1>Blog Posts</h1>

<ul>
  <?php foreach ($posts as $post) : ?>
    <li>
      <?= $this->Html->link($post->title, ['controller'=>'Posts', 'action'=>'view', $post->id]); ?>
    </li>
  <?php endforeach ?>
</ul>


じゃあ、もし「$posts」と「$tests」の2つの引数が渡されたらどうなる?

と、いうことで以下のコードを実行作って実行した。


・Controller

<?php

namespace App\Controller;

class PostsController extends AppController {
  public function index() {
    $posts = $this->Posts->find('all');
    $tests = $this->Posts->find('all');

    $this->set('posts', $posts);
    $this->set('tests', $tests);
  }
}
 ?>


・View

<?php
  $this->assign('title', 'Blog Posts');
 ?>

<h1>Blog Posts</h1>

<ul>
  <?php foreach ($posts as $post) : ?>
    <li>
      <?= $this->Html->link($post->title, ['controller'=>'Posts', 'action'=>'view', $post->id]); ?>
    </li>
  <?php endforeach ?>
</ul>

<ul>
  <?php foreach ($tests as $test) : ?>
    <li>
      <?= $this->Html->link($test->title, ['controller'=>'Posts', 'action'=>'view', $test->id]); ?>
    </li>
  <?php endforeach ?>
</ul>


取得してるデータは同じだけど、
"set"メソッドで渡した変数名と一致する箇所に渡された。


念のため、Controllerを以下のように修正して実行したところ、
エラーとなった


・修正後Controller

<?php

namespace App\Controller;

class PostsController extends AppController {
  public function index() {
    $posts = $this->Posts->find('all');
    $tests = $this->Posts->find('all');

    $this->set('posts', $posts);
    //$this->set('tests', $tests);
  }
}
 ?>


・結果

Notice (8): Undefined variable: tests [APP/Template/Posts/index.ctp, line 16]

Warning (2): Invalid argument supplied for foreach() [APP/Template/Posts/index.ctp, line 16]


値がねーよ!
って感じで怒られた。


このことから、
View側で実装している変数は
Controllerから必ず渡してあげなければならないことが
わかった。

◆なぜ理解できなかったのか?


おそらく、
Javaでは受け取る引数をメソッドの横に必ず明記している。
でも、Viewには明記してない。
(ControllerとModelには一応明記してある。)


なので、
渡した引数はどこで使ってんの?
ここで使う引数はどこで受け取ってんの?
って混乱したのだと思う。


単純に、
受け取った引数を同じ変数名の箇所で使用しているだけということ。


Viewって難しく考えてたけど、
本当に単純に、画面を構成しているだけ
と、いうことなんだな。