2012-05-26 4 views
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() вызов шаблона, они должны быть доступны для следующего представления, которое просто входит в область.

Что я пропустил?

+0

Не могли бы вы также ввести код класса пользователя? – josmith

+0

Если вы начинаете с предпосылки «сделать что-то вроде CI», то вы уже делаете это неправильно. –

+0

Никогда не говорил, что сделал, что было бы бессмысленно. – Seralize

ответ

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); 
    ... 
+0

Я знал о области функций, но начал свою карьеру программирования с помощью кода, такого как '$ var = 1; включают в себя ('file.php'); // содержит: echo $ var; ', и, насколько я помню, это сработало. Это должно быть потому, что включение называется внутри функции, в этом случае. Между прочим, это именно то, что я искал. Благодаря! – Seralize

+0

'include()' на самом деле не вызов функции, это фактически заявление и не вводит новую локальную область; однако во внешнем виде вы снова вызываете loadView(), который вводит новую область. – lanzz

+0

Вот что я имел в виду, вы :) – Seralize

Смежные вопросы