Есть система, состав: 1) библиотеки ядра 2) пользовательские библиотеки, претендующие на звание "ядровых" (свои драйвера для Translate, Cache, SessionStorage и тд) 3) 3rdparty libraries (Twig, zf, phpseclib, etc) 4) модули Модули бывают фронтенд и бекенд (клиент и админка соответственно). На клиентской части есть еще виджеты, которые запускаются через шаблоны. Определены интерфейсы вот этих модулей и виджетов: PHP: <?php interface BL_Application_ModuleInterface { public function __construct(BL_Context $context); public function process(); } interface BL_Application_WidgetInterface { public function __construct(BL_Context $context, $settings = array()); public function process(); } То есть в любой модуль или виджет мы обязательно передадим контекст. Что такое контекст? Контекст это PHP: <?php class BL_Context { /** * * @var BL_Loader */ protected $loader; /** * * @var BL_Application */ protected $app; /** * * @var BL_Request */ protected $request; /** * * @var BL_Response */ protected $response; /** * * @var BL_Page */ protected $page; /** * * @var BL_Locale */ protected $locale; /** * * @var BL_Event_Dispatcher */ protected $eventDispatcher; protected $db = array(); /** * * @var BL_Session */ protected $session = NULL; protected $user = NULL; protected $users = NULL; protected $usersManager = NULL; private static $instance = NULL; public function __construct() { $this->request = BL_Request::instance(); //TODO: use `new` $this->response = BL_Response::instance($this->request); $this->page = BL_Page::instance(); } /** * * @return BL_Context */ public static function instance() { return self::$instance ? self::$instance : self::$instance = new self; } public function injectApp(BL_Application $app) { $this->app = $app; $eventsDir = 'config/application/'; $eventsDir .= $app->isBackend() ? 'admin/events' : 'events'; $this->eventDispatcher = new BL_Event_Dispatcher($eventsDir); $this->loader ->injectApp($app) // BC ->injectContext($this); return $this; } public function injectLoader(BL_Loader $loader) { $this->loader = $loader; } /** * * @return BL_Application */ public function app() { return $this->app; } /** * * @return BL_Event_Dispatcher */ public function eventDispatcher() { return $this->eventDispatcher; } /** * * @return BL_Page */ public function page() { return $this->page; } /** * * @return BL_Request */ public function request() { return $this->request; } /** * * @return BL_Response */ public function response() { return $this->response; } /** * * @return BL_Database */ public function db($token = 'default') { return isset($this->db[$token]) ? $this->db[$token] : $this->db[$token] = new BL_Database(BL_Settings::get('database', $token)); } /** * * @return BL_Loader */ public function loader() { return $this->loader; } /** * * @return BL_Session */ public function session() { return $this->session ? $this->session : $this->session = new BL_Session($this->request, $this->response, array(), $this->eventDispatcher); } /** * * @return BL_Auth_User */ public function user() { return $this->user ? $this->user : $this->user = BL_Auth_User::instance($this); } /** * * @return BL_Auth_Users */ public function users() { return $this->users ? $this->users : $this->users = BL_Auth_Users::instance($this); } /** * * @return BL_Auth_Manager_Users */ public function usersManager() { return $this->usersManager ? $this->usersManager : $this->usersManager = BL_Auth_Manager_Users::instance($this); } } Здесь в основном instance - пережитки прошлого. Имеет ли право на жизнь такая система? Какие могут возникнуть проблемы в дальнейшем и как их разруливать?
да ) непонятно, зачем ты заводил красивые интерфейсы, если спаунишь сделай им тоже интерфейсы и заюзай какой нить dependency container (видимо симфониевский, раз уж у тебя там твиг и евент диспетчер ихние) А вообще, красиво так, нравится. Ну, и сам контекст тоже поменять бы. И инстансы из него возращать через мажик-методы, например, что бы не писать руками к каждому новому компоненту строчку в контекстном обьекте. Я кстати, вообще лох - у меня контекст - это не обьект, а просто массив
сорри, не понял контейнер не хочу, там рефлексия. В будущем возможно. Мне пока такого хватит. сейчас есть автодополнение в IDE за счет phpDoc'ов. оу, ее, +10 пунктов к самооценке
на жизнь имеет право всё, кроме кодогенератора =) а так, видится больше проблем чем удобства, во всяком случае для меня. контекст - массив, лучше смотрится.
у меня просто мурашки по коже, от класс монстра в который это может вилиться. а класс монстры это зло смотря какой опять же.
будет приобретать размеры монстра - заюзаю контейнер и все эти db()/request() - будут отрабатывать через __call. Тогда правда придется попрощаться с автодополнением. управление контентом - просто модуль. BL_Deploy, который я выкладывал недели 2 назад - из этого же fw.
Koc ты уже пробовал юзать это в реальном проекте. Попробуй, может вообще взгляд поменяешь. Попробуй в одном-двух...
в чем преимущество? только в ? или это просто: часть большой системы(c) если фреймворк или какая то либа тогда конечно в классы надо все прятать, что бы как сказал флоппик не засирать глобальную область видимости) а если нет то DD
та в том-то и весь прикол, что сейчас нужно другими вещами заниматься по этому проекту, но вот руки сопротивляются... Хочется определиться как быть дык я и не засираю глобальную область видимости
Koc я вот во многом не могу определиться пока не начну юзать реально и не в одном проекте, потому что ты просто пишешь как бы по ООП, всякие методики применяешь, типа инъекций, а нужны ли там реально эти инъекции или нет, фиг знает, может там и так всё завязано будет, что инъекции нафиг не нужны, ну это например. Пока не сделаешь на своих "велосипедах" пару-тройку РАЗНЫХ проектов, толком не поймешь. Ну мне так кажется. Я, допустим, не могу понять, потому что у меня опыта столько нету, чтобы сразу понять, или потому что я цели плохо ставлю. (зы: но я над этим усердно работаю ) правильно, она и так засрана кучей функций...
У тебя классы жестко закодены. Это херня, и вся твоя "гибкость" ломается тут. Поэтому то и нужен DI контейнер. А рефлексия там только в дампере, который юзается для кеширования (читай, нет) а даже если и есть - чем плоха рефлексия? Тем что будет выполнять скрипт, а не другой программист?
Koc так вся эта штука в итоге нужна чтобы инициализировать состояние объекта в итоге? Костян по мне так просто вся практически инфа про php oo начинается с того что показывают как описывается класс, дескрипторы и т.п. и еше шаблонов проектирования накидано из java, я сейчас решил java немного по изучать (или много если понравится ) так вот там ман и книжка начинается сразу с ооп, написано что "тут не получится писать не классами" (как то так) и начинается описание что зачем почему, почему так а не иначе, где применяется, чем полезно, подробно подробно... зы: строгая типизация убивает :\
У вас тут еще одна проблема, очень неочевидная для вас (да и в прошлом, и для меня):that cleverness cannot win. http://alarmingdevelopment.org/?p=422 Та же проблема по русски но в общих чертах - http://www.kraynov.com/2010/06/17/cheating-is-good/
Padaboo так у джавы по-моему не объектов и нету практически... а вообще, в php можно обходиться самыми примитивными шаблонами и массивами, потому что это конёк php, зато можно такое накрутить, которое нафиг не надо, но и можно сделать всё очень очень просто, гибко и аккуратно.
Apple еще в 2008 была http://www.php.net/manual/en/language.o ... .php#83442 но я не проверял его код. флоппик а, да то понятно, что сейчас классы захардкожены. Но главное то, что их названия уже в одном месте а не разбросаны по всему проекту. Ну какой контейнер посоветуешь? Phemto? Тот, который в sf2 не подходит так как требует 5.3.х, а тот, который в 1.4 - отпадает из-за не PEAR-именования классов
Apple это кто к чему привык)) флоппик Это метод симплеиста, учить человека находить ответ)) ну... на моем уровне лучше пробовать писать самому чтобы понимать как это работает, к примеру я не пользовался jquery пока не стал до конца уверен, что самостоятельно смогу реализовать хоть немного похожий функционал... кроме того это ж интересно самому написать то)
Костян намек в том что нету ничего зазорно использовать чужие решения, это экономит время, время = деньги) так что выходит писать свое решение дорого) как и перфекционизм) тут много тем было разных, что воткнуть железку дешевле чем выжимать последнее из кода и т.п. если я правильно понял конечно)
это экономит поиск ошибок которые уже кто-то нашел, экономит изменение другими кода после тебя, сводит исправление многих ошибок (а то и расширение функционала) к простому апдейту, это делает лучше всем. Я решил стать евангиелистом правильной парадигмы программирования )