Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Новая структура., Приснилось ))
twin  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15561
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 2 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Переделал я структуру на другой принцип. В двух словах:

1. Фреймворк запускается с пустым хранилищем. Вообще пустой.
2. При первом обращении за каким-нибудь сервисом включается билдер сервиса, формирует все зависимости, складывает в локатор и сразу выдает пользователю.
3. При следующих обращениях билдер отдыхает, просто достает сервис из локатора.

Что это дает.

1. Экономию памяти.
2. Не нужно мудрить с удовлетворением вложенных зависимостей на уровне контейнера со всякими рефлексиями.
3. Полную автономию компонентов и неограниченные возможности по их сборке в сервис
4. Подменив папку с билдерами на тесты мы легко получим автоматическое тестирование всего фреймворка.
5. Скрытые возможности. Можно совершенно спокойно обратиться напрямую к компоненту и творить с ним все что угодно. Это к вопросу о том, что задекларировано в спецификации:
Цитата
Фреймворк дает свободу программисту, не создавая каких-либо структурных ограничений и конвенций

6. Легкость разработки компонентов, так как они теперь могут спокойно взаимодействовать друг с другом, оставаясь самодостаточными.
7. Сервис можно компановать не только компонентами, но и внешними зависимостями.

Вобщем я не знаю, как этот паттерн называется, я не видел такого в тех фреймворках, в которых рылся в исходниках. Может проглядел, не важно. Важно что мне пока очень нравится.

Есть какие подводные камни?

Я на всякий случай сделал два компонента (mysqli и sqldebug), и билдер к ним.
Все вроде работает как часики smile.gif

Присоединённое изображение
Присоединённое изображение


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15561
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 2 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Молчание - знак согласия? Неужели ни у кого не возникло вопросов? И что, тут раскритиковать нечего что ли... Обидно даже. biggrin.gif


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
chee  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Сын полка
Сообщений: 1780
Пользователь №: 38654
На форуме: 2 года, 11 месяцев, 2 дня
Карма: 40




Молчание - отсутствия интереса.


--------------------
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации

Мой блог
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15561
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 2 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


chee
Ну а чего тогда тут делаешь? biggrin.gif


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2004
Пользователь №: 36605
На форуме: 3 года, 9 месяцев, 17 дней
Карма: 111




ящик пандоры какой-то

ничем не отличаеться от того что я руками подключу mysqlService когда мне надо будет его использовать прописав коннекты к нему и я бы хотел видеть ошибку при обращении к несуществующему сервису нежели открыть ящик пандоры и удалить весь контент


--------------------
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15561
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 2 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Цитата (bestxp @ 23.10.2015 - 07:50)
ящик пандоры какой-то

ничем не отличаеться от того что я руками подключу mysqlService когда мне надо будет его использовать прописав коннекты к нему и я бы хотел видеть ошибку при обращении к несуществующему сервису нежели открыть ящик пандоры и удалить весь контент

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


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2004
Пользователь №: 36605
На форуме: 3 года, 9 месяцев, 17 дней
Карма: 111




ну ты так написал что builder сам все сделает =) значит он решает за меня как лучше
а зачем мне навязывать решения

или ты не так выразился что теперь точно не понять


--------------------
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  [x] Дата
Цитировать сообщение

Пользователь сейчас на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15561
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 2 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Смысл вот в чем. Разбить функционал на мелкие компоненты, а в билдере собирать из них сервис. Вот сейчас есть компонент коннекта Mysqli к примеру и есть компонент коннекта PDO. И есть третий, это дебаггер SQL. Так вот билдер собирает нужную конфигурацию. Берет дебаггер и передает его зависимостью в коннект. Из трех компонентов можно сделать два сервиса. Если добавить еще какой-нибудь, условно скажем SQLite (так не выйдет сейчас, адаптировать надо), то три сервиса из 4 компонентов. Ну и так далее.

Собирается все по общему принципу, в Closure. Но не помещается в конейнер сразу. А только при первом обращении. При следующием готовый сервис достается из контейнера уже.

Вот так билдер устроен:

/**
* Получает сервис из локатора если он есть
* или сначала помещает его туда
*
*
@return object
*/

public function get()
{
if (!$this->locator->checkService($this->service)) {
$this->buildService();
}

return $this->locator->get($this->service);
}

/**
* Строит сервис, удовлетворяя зависимости.
*
*
@return void
*/

protected function buildService()
{
$component = '\ABC\abc\components\\'. $this->service .'\\'. $this->service;
$data = @$this->config[$this->service] ?: [];

$this->locator->setGlobal(
$this->service,
function() use ($component, $data) {
$data['debugger'] = isset($data['debug']) ? new SqlDebug(new View) : null;
return new $component($data);
}
);
}

На каждый сервис свой билдер.

Что я жду от этого, читай выше. :)

А ошибку выдаст процессор, зачем в каджый билдер совать исключения.
    /**
* Выбирает и запускает сервис
*
*
@return object
*/

public function getService($service = null)
{
if (empty($service) || !is_string($service)) {
throw new \InvalidArgumentException('Service name should be a string', E_USER_WARNING);
}

$builder = '\ABC\abc\builders\\'. $service .'Builder';

if (!class_exists($builder)) {
throw new \BadFunctionCallException('Service "'. $service .'" is not defined.', E_USER_WARNING);
}

$builder = new $builder;
$builder->config = $this->config;
$builder->locator = $this->locator;
return $builder->get($service);
}


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2004
Пользователь №: 36605
На форуме: 3 года, 9 месяцев, 17 дней
Карма: 111




тогда не очень удачное решение

лучше я руками буду подключать нужный мне сервис делая так например


$app->register(new SqlServiceProvider(), [
'dsn' => 'mysql://localhost

]);



чем надеяться на систему, так как в любом случае мне же надо прописать коннект


--------------------
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15561
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 2 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Коннект вообще то в конфиге прописывается. Вот:
                'mysqli'    =>  ['host'  => 'localhost', 
'user' => 'root',
'pass' => '',
'base' => 'test',
'debug' => true
],

Билдер сам настраивает коннект. Да и вообще тут речь не об использовании юзером контейнера. Тут речь о сборке штатных сервисов фреймворка. А на стороне клиента конечно можно и руками писать. Просто если нужен готовый сервис PDO с дебаггом запросов, то получить его можно одной строчкой

$pdo = Abc::getService('Pdo');
И мы получим готовый, сконнекченный объект PDO с оберткой query() для дебаггинга. И сервис будет уже им укомплектован. А можно получить чистый компонент и делать с ним всё что хочешь. И можно как ты - руками прописать в контейнер. Но для этого сначала нужно получить сервис контейнера :)



--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2004
Пользователь №: 36605
На форуме: 3 года, 9 месяцев, 17 дней
Карма: 111




Твин забудь этот сон как какой-то кошмар ибо то что ты пытаешься сделать это просто ужас чес слово


у тебя уже получается неоднозначное поведение

либо у тебя компонентное и каждый компонент добавляеться руками и у тебя минимальная связность либо у тебя примет Yii и все склеено так что и ничего не вытащить



--------------------
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2004
Пользователь №: 36605
На форуме: 3 года, 9 месяцев, 17 дней
Карма: 111




как пример

мне нужен mysql

я смотрю есть ли готовый сервис ?
да - я подключаю его и прописываю конфиг
нет - я делаю свой и подключаю его


вызывая get('mysql')
если я его не настроил и он есть в системе получаю ошибку что нет такого сервиса
если он настроен и подключен мной то и получаю сервис и работаю
вариант автоматически подключился и тем более настроился это плохой вариант

либо сервис есть и он настроен подключен по умолчанию ( описываем в доках )
либо ошибка доступа к несуществующему сервису

так как в случае опечатки или чего еще мы двруг выполняем совершенно другую работу и у нас проблемы Док!


--------------------
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15561
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 2 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


bestxp
,,,,,,,,,,,,,,,,,,,,,,,,, <- вот. Если кончатся, попроси, у меня еще есть. :)
Я пять раз прочитал и толком не въехал. Попытаюсь объяснить, как понял.
Цитата
если я его не настроил и он есть в системе получаю ошибку что нет такого сервиса

Весь фокус в том, что это у меня уже работает. Я могу сразу и проверить. Так вот, без настроек, или с опечаткой в настройках, я получаю ошибку не о том, что сервис не существует, а вот этот эксепшен:
Цитата
Component Mysqli: wrong data connection in the configuration file

А если ошибка в самих данных коннекта, то поведение обычное для объекта mysqli. Тобишь я получаю объект и могу посмотреть, что там случилось:
        $mysqli = Abc::getService('Mysqli');
echo $mysqli->connect_error;

Цитата
Unknown database 'dummy'

Что где не так?


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса