【问题标题】:How can I pass variables to my views in php如何在 php 中将变量传递给我的视图
【发布时间】:2013-02-01 15:10:31
【问题描述】:

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

控制器类:

<?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)。

【问题讨论】:

  • @JosephSilber 构建自定义框架。更多学习。

标签: php templates scope


【解决方案1】:

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

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

【讨论】:

  • 太棒了!奇迹般有效。感谢您提供有关视图与模板的信息!我会仔细阅读。
  • 甚至不需要调用extract,因为数据已经在$this-&gt;args 中可用。
  • @Jack ,我实际上建议不要这样做。它将添加 “必须从对象内呈现” 作为隐藏要求。
  • 有道理,尽管“必须用这些全局变量渲染听起来对我来说同样糟糕”:)
  • @Jack ,好吧 .. 模板使用的变量不是全局的。唯一的要求是它们存在于呈现所述模板的范围内。
【解决方案2】:

试试这个:

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

【讨论】:

  • 该范围内没有变量 $data
【解决方案3】:

最简单的方法是将$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 文件,因此在包含之前必须存在所有变量

如果你不想传递变量,你可以在模板中使用 $this->args

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2015-12-23
      • 2020-07-11
      • 2015-09-12
      • 2023-03-14
      • 2012-12-19
      • 2011-09-05
      相关资源
      最近更新 更多