2012-01-05 1 views
2

Я работаю с 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'); 
    } 
} 

Конечно, это не решает ничего, потому что я все еще нужен класс контроллера, но мы надеемся, это поможет как ключ к проблеме.

Может ли кто-нибудь понять, почему я теряю содержимое реестра $, когда оно переходит к индексу?

ответ

1

Это должно работать:

class Index extends Controller 
{ 
    public function __construct($registry) 
    { 
     parent::__construct($registry); 
    } 

    public function index() 
    { 
     $this->registry->template->welcome = 'Welcome'; 
     $this->registry->template->show('index'); 
    } 
} 

В PHP Конструкторы не наследуются.

Возможно, вам понравится смотреть это видео и некоторые другие из серии: The Clean Code Talks - Don't Look For Things!.

+0

Спасибо за отличную ссылку. Я смотрел ее уже три раза, и серия мне очень помогает. – cantera