0

我有一个包含加载视图的方法的类。这工作完美,页面加载正确!我遇到的问题是我似乎无法找到将变量传递给我的方法当前尝试加载的视图的方法。如何将变量传递给页面?有没有办法可以操纵我当前的代码来完成这项工作?还是我会朝着完全相反的方向前进?

控制器类:

<?php
    class Controller {

        private $args = array();

        public function view($page, $args = null) {

            if ($args !== null) {
                $this->args = $args;
                extract($this->args);
            }

            $page = VIEWS . $page . '.php';
            $template = $this->getTemplate($page);

            echo $template;
        }

        private function getTemplate($file) {
            ob_start();
            include($file);
            $template = ob_get_contents();
            ob_end_clean();
            return $template;
        }
    }
    ?>

控制器:

<?php
    class Page extends Controller {

        public function person($age) {
            $data['age'] = $age;
            $this->view('person', $data);
        }

    }
?>

查看内容:

</h1>My name is Dennis. My age is: <?php echo $age; ?></h1>

最终结果是一个未定义的变量 ($age)。

4

4 回答 4

3

您提取的变量在view()中不可用getTemplate()。这是一个不同的范围。您应该使用与渲染相同的方法来提取它们。

此外,您所拥有的不是 MVC 视图。它只是一个模板。MVC 中的视图是负责 UI 逻辑的实例。它应该从模型层请求它需要的信息,然后,如果响应不仅仅是 HTTP 位置标头,则使用多个模板创建 HTML。

于 2013-02-01T15:13:58.967 回答
1

试试这个:

</h1>My name is Dennis. My age is: <?php echo $data['age']; ?></h1>
于 2013-02-01T15:13:05.623 回答
1

最简单的方法是将$args变量传给getTemplate,在getTemplate方法中做extract方法

private function getTemplate($file, $args = null) {
    if ($args !== null) {
        extract($args);
    }
    ob_start();
    include($file);
    $template = ob_get_contents();
    ob_end_clean();
    return $template;
}

当您包含并捕获输出时,将执行该 php 文件,因此在包含之前必须存在所有变量

If you dont want to pass down variables you can use $this->args inside of the template

于 2013-02-01T15:16:39.167 回答
0

您提取变量的方法与包含模板的方法不同。如果您想在模板中使用普通变量,请确保将它们提取到相同的范围内。

于 2013-02-01T15:13:31.503 回答