Я работаю с контроллерами и представлениями (без фреймворка) и имею проблему с требованием представления от родительского контроллера, что приводит к неопределенности переменных.
Есть основной Контроллер с функцией представления, которая выполняет запрос представлений.
class Controller {
public function view($view, $data =[]){
require_once './app/views/' . $view . '.php';
}
Затем есть пользовательский контроллер, расширяющий контроллер с помощью метода «mypage», который загружает данные в переменные и требует представления. (Вы можете получить доступ к Mypage в URL, если вы вошли в систему).
class User extends Controller{
public function mypage(){
$userdetails = $this->getuserdetails();
$userstatus = $this->getstatus();
$messages = new Messages();
$showmessages = $messages->showMessages();
$friends = new Friends();
$outrequests = $friends->outRequests();
$increquests = $friends->incRequests();
$friendsstatuses = $friends->friendsstatuses();
$getfriends = $friends->friends();
$this->view('mypage');
}
}
Линия $ This-> Вид ( ‘MyPage’); запускает метод представления в родительском контроллере, который требует представления mypage (mypage.php), где используются переменные. Проблема в том, что все переменные становятся неопределенными в mypage.php.
Если я обменяю эту строку с
require_once "./app/views/mypage.php";
, тогда это работает. Итак, почему я теряю переменные при запросе от контроллера, и что я делаю неправильно?
Дикая догадка, но я думаю, что это проблема масштаба:
Вы определяете свои переменные в mypage()
функция, поэтому эти переменные живут только в области действия этой функции.
призвание $this->view(...)
просто вызывает другой метод, который имеет свою область видимости (где ваши переменные не существуют).
Принимая во внимание, что когда вы звоните напрямую require_once(...)
Ваш включенный скрипт просмотра наследует переменные, уже определенные в текущей области видимости.
Других решений пока нет …