0

我正在构建自己的 MVC 框架,并且在将变量发送到视图时遇到了问题。loadView()看起来像这样:

function loadView($view, $variables = array())
{
    $file_path = APPLICATION_PATH . 'views/' . $view;

    if (file_exists($file_path))
    {
        if (is_readable($file_path))
        {
            if (! empty($variables)) extract($variables);
            include($file_path);
        }
        else
        {
            throw new Exception('Could not read view from ' . $file_path);
        }
    }
    else
    {
        throw new Exception('Could not load view from ' . $file_path);
    }
}

它按预期工作。但是,当我设置这样的模板视图时,事情变得很奇怪:

loadView('layout/header.php');
loadView($view);
loadView('layout/footer.php');

它是这样调用的($user是一个对象):

$data['view'] = 'login/showUser.php';
$data['user'] = $user;
loadView('layout/template.php', $data);

$view变量在模板文件中设置并加载正确的视图。但是,该$user变量无法进入仅包含以下代码的动态加载视图:

<p>User ID: <?php echo $user->id; ?></p>

我可以在 CodeIgniter 中执行此操作,但我觉得这有点奇怪,因为在第一次调用模板时提取$view$user变量时loadView(),它们应该可用于下一个视图,该视图只是包含在范围中。

我忽略了什么?

4

1 回答 1

1

每个 loadView() 调用都有自己的本地范围,在 loadView() 的不同调用之间不共享。在 CodeIgniter 中,这可能有效,因为它的视图渲染器将变量存储在一些静态存储中。您需要在每个视图中显式传递您需要的所有变量,或者您需要将静态存储添加到 loadView(),如下所示:

function loadView($view, $variables = array())
{
    static $static_vars = array();
    $static_vars = array_merge($static_vars, $variables);
    ...
    extract($static_vars); // instead of extract($variables);
    ...
于 2012-05-26T18:20:07.760 回答