Свойства доступа в файле View phtml, которые были установлены в контроллере

Я работаю на небольшом PHP-сайте, основанном на MVC. У меня есть фронт-контроллер ( front.php ), который загружает контроллер ( services.php ), запускает метод действия ( hostingAction() ) и включает html ( view.phtml ). Существует вызов метода в view.phtml ( $this->renderContent() ), который включает внутренний контент ( hosting.phtml ).

ВОПРОС: Как я могу установить свойства (например, $title = 'My Title'; ) в hostingAction() а затем в view.phtml do <title><?php echo $title ?></title> $title = 'My Title'; <title><?php echo $title ?></title> ?

Zend Framework делает что-то вроде $this->view->title = 'My Title'; в контроллере, а затем в представлении делает что-то вроде <title><?php echo $view->title; ?></title> <title><?php echo $view->title; ?></title> .

В настоящее время я перегружаю свойства. Я могу настроить свойства в действии контроллера, но не смог получить к ним доступ в моем представлении. Что я здесь делаю неправильно?

ОБРАЗЕЦ КОДА:

front.php

 class front { private $view; function __construct() { $this->view = new viewProperties(); $this->constructController(); include('application/views/view.phtml'); } private function constructController() { $c = new services(); $this->doAction($c); } public function renderContent() { include('application/views/services/hosting.php'); } private function doAction($c) { $c->hostingAction(); } } в class front { private $view; function __construct() { $this->view = new viewProperties(); $this->constructController(); include('application/views/view.phtml'); } private function constructController() { $c = new services(); $this->doAction($c); } public function renderContent() { include('application/views/services/hosting.php'); } private function doAction($c) { $c->hostingAction(); } } в class front { private $view; function __construct() { $this->view = new viewProperties(); $this->constructController(); include('application/views/view.phtml'); } private function constructController() { $c = new services(); $this->doAction($c); } public function renderContent() { include('application/views/services/hosting.php'); } private function doAction($c) { $c->hostingAction(); } } 

services.php

 class services { public function hostingAction() { $this->view->page_title = 'Services - Hosting'; $this->view->banner_src = '/assets/images/banners/home_02.jpg'; $this->view->banner_title = 'reload'; } } 

viewProperties.php

 class viewProperties { private $data = array (); public function __set($name, $value) { $this->data[$name] = $value; } public function __get($name) { if (array_key_exists($name, $this->data)) { return $this->data[$name]; } } } 

view.phtml

 <html> <head> <title><?php echo $this->view->page_title; ?></title> </head> <body> <?php $this->renderContent() ?> </body> </html> 

hosting.phtml

 <div id="banner"> <img src="<?php echo $this->view->banner_src ?>" alt="<?php echo $this->view->banner_title ?>" /> </div> 

Объект Services не имеет доступа к $view .

Попробуйте эти моды:

front.php (с сеттером)

 class front { private function constructController() { $c = new services(); $c->setView($this->view); $this->doAction($c); } } 

services.php (с сеттером)

 class services { private $view; public function setView(viewProperties $view) { $this->view = $view; } public function hostingAction() { $this->view->page_title = 'Services - Hosting'; $this->view->banner_src = '/assets/images/banners/home_02.jpg'; $this->view->banner_title = 'reload'; } } 

Использование Singleton

Кроме того, вы можете сделать viewProperties синглом (по вашим комментариям):

viewProperties (с singleton)

 class viewProperties { private $instance = null; private function __construct() {} public static function getInstance() { if (null === $this->instance) { $this->instance = new self(); } return $this->view; } } 

передний (с одноэлементным)

 class front { private $view; function __construct() { $this->view = viewProperties::getInstance(); $this->constructController(); include('application/views/view.phtml'); } } в class front { private $view; function __construct() { $this->view = viewProperties::getInstance(); $this->constructController(); include('application/views/view.phtml'); } } 

services.php (с singleton)

 class services { private $view; function __construct() { $view = viewProperties::getInstance(); } public function hostingAction() { $this->view->page_title = 'Services - Hosting'; $this->view->banner_src = '/assets/images/banners/home_02.jpg'; $this->view->banner_title = 'reload'; } } 

Использование многомерных переменных

Наконец, что касается использования «banner_src» и «banner_title», вы можете использовать метод, упомянутый в вашем исходном сообщении, который масштабируется лучше.

ПРИМЕЧАНИЕ . Пример ниже был скопирован из моего ответа на ваш оригинальный пост и не был исправлен в соответствии с вашим новым кодом. Он показывает, что вы можете хранить массивы () для многомерных данных и показывать, как получить к ним доступ из вашего представления.

 class services extends controller { public function indexAction() { $this->view->banner = array ( 'src' => '/path/to/images/banners/home_02.jpg', 'alt' => 'banner title' ); } public function hostingAction() { $this->view->banner = array ( 'src' => '/path/to/images/banners/home_02.jpg', 'alt' => 'banner title' ); } } <img src="<?php echo $this->view->banner['src'] ?>" alt="<?php echo $this->view->banner['title'] ?>" />