无法在视图中使用变量

时间:2012-05-26 17:58:07

标签: php model-view-controller scope

我正在构建自己的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调用中提取$userloadView()变量时,它们应该可用到下一个视图,它只是包含在范围内。

我忽略了什么?

1 个答案:

答案 0 :(得分: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);
    ...