2012-11-09 4 views
0

Я создал свою собственную структуру MVC и интересуюсь тем, как другие фреймворки могут отправлять свойства с «контроллера» на «представление». Zend делает что-то вдоль линий $this->view->name = 'value'; Мой код:PHP Overloading, singleton instance

файл: services_hosting.php

class services_hosting extends controller { 
    function __construct($sMvcName) { 
     parent::__construct($sMvcName); 

     $this->setViewSettings(); 
    } 

    public function setViewSettings() {   
     $p = new property; 
     $p->banner = '/path/to/banners/home.jpg'; 
    } 
} 

файл: controller.php

class controller { 
    public $sMvcName = "home"; 

    function __construct($sMvcName) { 
     if ($sMvcName) { 
      $this->sMvcName = $sMvcName; 
     } 

     include('path/to/views/view.phtml'); 
    } 

    public function renderContent() { 
     include('path/to/views/'.$this->sMvcName.'.phtml'); 
    } 
} 

файл: property.php

class property { 

    private $data = array(); 
    protected static $_instance = null; 

    public static function getInstance() { 
     if (null === self::$_instance) { 
      self::$_instance = new self(); 
     } 

     return self::$_instance; 
    } 

    public function __set($name, $value) { 
     $this->data[$name] = $value; 
    } 

    public function __get($name) { 
     if (array_key_exists($name, $this->data)) { 
      return $this->data[$name]; 
     } 
    } 

    public function __isset($name) { 
     return isset($this->data[$name]); 
    } 

    public function __unset($name) { 
     unset($this->data[$name]); 
    } 

} 

В моем файле services-services services.host.phtml у меня есть:

<img src="<?php echo $this->p->banner ?>" /> 

Это просто не работает. Я делаю что-то принципиально неправильное или неверно? На данный момент я, кажется, собираюсь кругами. Любая помощь будет очень высоко ценится.

+0

Как выглядит ваш передний контроллер? Мне очень нравится, как symfony2 обрабатывает это с помощью объекта ответа. См. Http://symfony.com/doc/2.0/book/http_fundamentals.html – shapeshifter

+0

Перегрузка и Синглтон часто являются концепцией конфликта. Подумайте о том, чтобы удалить Синглтон и посмотреть, не исчезла ли ваша проблема. Если вам нужны экземпляры одного объекта этого класса, сохраните их в глобальной переменной или глобальном массиве на данный момент. – hakre

+0

@hakre Первоначально в моем.PHTML я имел: '$ р = свойство :: деЫпзЬапс();' тогда: ' jamalali81

ответ

0

Мой фронт-контроллер выглядит это

class front { 

    private $sMvcName = 'home'; 

    function __construct() { 
     $aUriParts = $this->getUriParts(); 

     if ($aUriParts[0]) { 
      $this->sMvcName = implode("_", $aUriParts); 
     } 

     $this->constructController(); 
    } 

    private function constructController() { 
     $this->view = new property(); 
     $sControllerName = $this->sMvcName; 
     new $sControllerName($this->sMvcName); 
    } 

    private function getUriParts() { 
     $sUri = $_SERVER['REQUEST_URI']; 
     $sUri = trim($sUri, "/"); 
     $sUri = str_replace("-", "_", $sUri); 
     $aUriParts = explode("/", $sUri); 
     return $aUriParts; 
    } 

} 

services_hosting.php теперь выглядит следующим образом

class services_hosting extends controller { 

    function __construct($sMvcName) { 
     $this->setViewSettings(); 

     parent::__construct($sMvcName); 
    } 

    public function setViewSettings() { 
     $this->view->banner = '/assets/images/banners/home_02.jpg'; 
    } 

} 
0

Вы можете проверить, работает ли это?

В вашем controller.php вы создаете объект вида

function __construct() { 
    $this->view = new property(); 
} 

Сейчас в нашем хостинга контроллер

class services_hosting extends controller { 
function __construct($sMvcName) { 
    parent::__construct($sMvcName); 

$this->view->banner = '/path/to/banners/home.jpg'; 
} 

}

Переменная баннер должен быть доступен в файле ПРОСМОТРЕТЬ ,

<img src="<?php echo $this->banner ?>" /> 

Надеется, что это будет работать ...

+0

Спасибо @ Dinesh. Я дам это позже. Один вопрос: мне нужно объявить $ view в верхней части класса? eg 'public $ view = null;' – jamalali81

+0

Я не думаю, что это необходимо Но я думаю, что его хорошая практика - объявить переменную. В PHP вам нужно назначить null .. public $ view; будет работать. – Dinesh

+0

Хорошо, что вы предложили, не работает, но я, наконец, исправил его. объект view в моем переднем контроллере до создания объекта services_hosting. Затем я устанавливаю параметры представления перед конструированием родительского контроллера (т.е. controller.php). Затем echo $ th is-> view-> banner в .phtml – jamalali81

0
<img src="<?php echo $this->p->banner ?>" /> 

implys вы находитесь в экземпляре класса. Вы сказали, что сво внешний файл, так что вы, вероятно, что-то вдоль линий

$a = new services_hosting(); 

В этом случае вместо

$this->banner; 

вы бы

$a->banner; 
+0

Файл .phtml входит в состав controller.php, который является родительским объектом services_hosting.php, который создает свойство класса '$ p = новое свойство;' Я пробовал: '$ p = property :: getInstance();' then: ' ' но это не сработало. – jamalali81