Я работаю с PHPRO's MVC framework, и у меня возникают проблемы с передачей объекта реестра моему классу контроллера.PHP MVC: реестр потерян на пути к контроллеру
В классе Router метод loadController() определяет, какой контроллер загружает и создает его. В процессе, он передает на контроллер объект реестра, который содержит, среди прочего, шаблон объекта:
class Router
{
private $registry; // passed to Router's constructor
public $file; // contains 'root/application/Index.php'
public $controller; // contains 'Index'
public function loadController()
{
$this->getController(); // sets $this->file, $this->controller
include $this->file; // loads Index controller class definition
$class = $this->controller;
$controller = new $class($this->registry);
}
}
От Xdebug, я знаю, что свойство $ реестра маршрутизатора есть все, что он должен до передается как аргумент конструктору индекса.
Однако системный реестр $ не может сделать его индексом неповрежденным. Вот определение класса для индекса и его родительского контроллера:
abstract class Controller
{
protected $registry;
function __construct($registry)
{
$this->registry = $registry;
}
abstract function index();
}
class Index extends Controller
{
public function index()
{
$this->registry->template->welcome = 'Welcome';
$this->registry->template->show('index');
}
}
с кодом, как показано на рисунке, я получаю сообщение об ошибке: «Призыв к неопределенному методу StdClass :: шоу() в ... index.php» ,
Внутри индекса Xdebug показывает $ registry как null, поэтому я знаю, что он наследуется от родителя. Но где-то между кодом для создания нового объекта Index и определения класса Index, $ registry теряется.
Во время отладки, я обнаружил, что исключает класс контроллера из уравнения останавливает ошибку возникновения:
class Index // extends Controller
{
private $registry;
function __construct($registry)
{
$this->registry = $registry;
}
public function index()
{
$this->registry->template->welcome = 'Welcome';
$this->registry->template->show('index');
}
}
Конечно, это не решает ничего, потому что я все еще нужен класс контроллера, но мы надеемся, это поможет как ключ к проблеме.
Может ли кто-нибудь понять, почему я теряю содержимое реестра $, когда оно переходит к индексу?
Спасибо за отличную ссылку. Я смотрел ее уже три раза, и серия мне очень помогает. – cantera