Переменная вида недоступна в шаблоне - PullRequest
0 голосов
/ 16 декабря 2018

в моем PagesController :: display () у меня есть этот код:

class PagesController extends AppController {

    public function display(...$path) {
        $count = count($path);
        if (!$count) {
            return $this->redirect('/');
        }
        if (in_array('..', $path, true) || in_array('.', $path, true)) {
            throw new ForbiddenException();
        }
        $page = $subpage = null;

        if (!empty($path[0])) {
            $page = $path[0];
        }
        if (!empty($path[1])) {
            $subpage = $path[1];
        }
        $this->set(compact('page', 'subpage'));

        try {
            $this->render(implode('/', $path));
        } catch (MissingTemplateException $exception) {
            if (Configure::read('debug')) {
                throw $exception;
            }
            throw new NotFoundException();
        }
        $test = "abc";
        $this->set(compact('test'));
    }
}

Это почти то же самое, что и стандартный контроллер страниц , я добавил последние две строки.

Мой шаблон home.ctp содержит:

<?php
var_dump($test);
...

Когда я захожу на сайт, это выводит:

C:\wamp64\www\site\src\Template\Pages\home.ctp:322:null

Что сбивает с толку, потому что отладочный комплект показывает, что эта переменная была установлена:

debug kit variables panel

Почему тестовая переменная недоступна в шаблоне home.ctp?

1 Ответ

0 голосов
/ 16 декабря 2018

Визуализация вызывается перед установкой

   try {
        $this->render(implode('/', $path)); <----
    } catch (MissingTemplateException $exception) {
        if (Configure::read('debug')) {
            throw $exception;
        }
        throw new NotFoundException();
    }
    $test = "abc";
    $this->set(compact('test')); <-----
}

Вызов на установку просто слишком поздний - это уже после того, как шаблон уже использовался.

Чтобы иметь какой-либо эффект, вызов setдолжно быть перед вызовом render, то есть:

$test = 'abc';
$this->set(compact('page', 'subpage', 'test')); <---

try {
    $this->render(implode('/', $path)); <---
...

Почему переменная отображается в DebugKit?

DebugKit запрашивает экземпляр контроллера для получения используемых переменных представления - Но при этом запускается rightв конце запроса .Это причина, по которой он обнаружен отладочным набором, даже если он не был доступен в шаблоне.

...