Духовность™
респект, я здесь родил новый подход для своего фреймворка.
создал единую точку класс
PHP:
<?php
class Kiss_Service {
protected static $run = false;
protected $services = array();
public function __construct() {
if (self::$run) {
throw new Exception('Locator: already running');
}
}
public function addService($serviceValue, $serviceName = null) {
$serviceName = $serviceName ? $serviceName : get_class($serviceName);
if (!isset($this->services[$serviceName])) {
$this->services[$serviceName] = $serviceValue;
} else {
throw new Exception("Locato: already have service: $serviceName");
}
}
public function &__get($serviceName) {
if (isset($this->services[$serviceName])) {
return $this->services[$serviceName];
}
}
/**
*
* @return Kiss_Request
*/
public function getRequest() {
if (!isset($this->services['Request'])) {
$this->addService(new Kiss_Request(), 'Request');
}
return $this->Request;
}
/**
* @return Kiss_Config
*/
public function getConfig() {
if (!isset($this->services['Config'])) {
$this->addService(new Kiss_Config(), 'Config');
}
return $this->Config;
}
}
?>
принцип такой:
создал
единую точку по аналогии с лимбовским тулкитом, но без вских mixin.
заткнул конструктор, чтобы сервис можно было инициализировать лишь единожды, но при этом не использовал singleton, чтобы им
не могли воспользоваться в любой части приложения (списибо
korchasa за идею контекста для реестра).
использовал для добавления сервисов используется метод позволяющий
только добавлять новые, без возможности переназначить (спасибо
fixxxer за пояснение идеи реестра).
создал
предефайненные методы для основных сервисов, возможно addService вообще сделаю закрытым, чтобы сервисы не добавлялись извне.
в начале инициализирую сервис и
передаю объект в конструкторы
в конструкторе
берутся нужные сервисы и присваиваются атрибутам класс, для удобной работы с ними, сам
сервис в классе за пределами конструктора не .
получился этакий приручённый god object.
жду критики.
p.s. За час написал класс и переделал фреймворк под него, в очередной раз убедился, что гибкость web фреймворкам нафик не нужна (ну почти).
p.p.s. Вылезли
грабли с ленивой инициализацией шаблонизатора, поэтому в контроллере прародителе сделал пришлось сделать private атрибут для работы с сервисом.