Kohana 中的全局视图变量

Posted

技术标签:

【中文标题】Kohana 中的全局视图变量【英文标题】:Global view variables in Kohana 【发布时间】:2013-11-26 14:40:46 【问题描述】:

我正在尝试弄清楚如何在 Kohana 中正确使用全局视图变量。我有一个 Controller_Base 类,它提供了页面的基本布局:

abstract class Controller_Base extends Controller_Template 

  public $template = 'base';

  public function before () 
    parent::before();
    View::set_global('title' , '');
  

我的base.php 视图如下所示:

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title><?php echo $title; ?></title>
</head>
<body>
  <?php echo $content; ?>
</body>
</html>

我还有一个Controller_Welcome 类继承自Controller_Base

class Controller_Welcome extends Controller_Base 

  public function action_index () 
    $this->template->content = View::factory('welcome');
  

welcome.php 视图如下所示:

<?php $title = 'Some title'; ?>
<h1>Hello, world!</h1>

问题是:如何从welcome.php 修改全局$title 变量,以便在视图链的末尾base.php 可以得到它?我不想将与视图相关的任何内容放入控制器中。

【问题讨论】:

“我不想将任何与视图相关的东西放入控制器中。”但是控制器负责为视图提供所需的数据。也许你喜欢 Kostache 的工作方式。 是的,你可能是对的。但我认为“所有发生的事情都在视野中”:-) 我知道 Kostache,但想知道是否有本地解决方案。 我认为你必须编写自己的模板控制器才能工作。通过这种方式,您可以管理渲染模板的顺序以及设置和使用变量的时间。 查看bind_global()。对我来说,模板(base.php)视图在最后呈现是有道理的,首先,必须设置所有模板变量,这只能在它包含的所有视图和变量的执行和呈现期间发生。 @AmazingDreams 我知道bind_global()。它将某个变量(或类属性)的引用指向View::$_global_data。这意味着我应该用一个变量或一个类属性来存储它。而且我还需要以某种方式从视图中访问它。 【参考方案1】:

你应该可以这样做:

welcome.php查看:

<?php View::set_global('title', 'Some title'); ?>
<h1>Hello, world!</h1>

Controller_Welcome类:

class Controller_Welcome extends Controller_Base 

    public function action_index () 
        $this->template->content = View::factory('welcome')->render();
    

请注意对render() 的调用 - 这是非常重要才能使其正常工作!在正常的执行流程中,base 视图将首先被评估,然后是内部。为了在渲染基础之前调用set_global,您必须先显式渲染内部。


除此之外:如果您正在做任何重要的模板工作,您真的应该考虑将 Kostache 与适当的“ViewModel”类一起使用,这是解决此问题的一种更优雅的方法。

【讨论】:

以上是关于Kohana 中的全局视图变量的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 Kohana 控制器中的会话变量

表的列名作为Kohana3框架中的变量

Dart 中的全局变量

Laravel Blade 中的全局变量

SAIKU UI 在视图之间共享全局变量

所有控制器和视图的全局变量