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>

$viewCodeIgniter でこれを行うことができますが、テンプレートへの最初の呼び出しで変数と$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 に答える