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

> Устройство сервиса., Пособие для примкнувших))
twin  
 ۩  [x] Дата
Цитировать сообщение

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



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

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

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


Тем, кто хочет принять участие в разработке, сей мануал посвящается. :)

Начнем с архитектуры. Фреймворк строится на основе SOA. Это значит, что он основывается на отдельных, слабо связанных компонентах. Ну подробности там есть.

Ядро фреймворка осуществляет управление приложением (роутинг, режимы ошибок, еще несколько плюшек), помогает в отладке (дебаггер) и формирует сервисы.

Что такое сервис. Сервис, это набор компонентов, которые необходимы для выполнения определенной задачи. Рассмотрим на действующем примере. Есть компонент Mysqli. Это обычный класс, который унаследован от штатного, законнекчен и немного расширен для дебаггинга запросов. И есть компонент Sqldebug, это универсальный для всех СУБД компонентов, дебаггер. Вместе они составляют сервис.

Сервис строится билдером (строитель по английски). В зависимости от настроек конфигурации. Построенный интерфейс сервиса упаковывается в сервис-локатор. Откуда мы потом его будем получать по мере необходимости.

Но делает билдер это не сразу, а только тогда, когда к нему обратятся за сервисом. Поэтому фреймворк использует только те сервисы, которые запрашиваются пользователем.

Теперь правила построения компонентов, билдеров и сервисов.

Компоненты.

1. Компоненты располагаются в папке components.
2. Каждый в собственной директории.
3. Название директории, файла и основного класса (интерфейса компонента) должны совподать.
4. Название компонента должно отражать его суть, быть максимально коротким и состоять из одного слова.
5. Основной класс (интерфейс) должен уметь принимать зависимостями объекты дополнительных компонентов. Тоесть там для них должны быть объявлены публичные свойства.
6. Внедрение зависимостей осуществляются только через свойства или сеттеры, но не через конструктор.
7. В конструктор интерфейса обязательно должны передаваться настройки конфигурации.

Ну а дальше дело фантазии.

Вот тренировочные компоненты
Первый.
<?php

namespace ABC\Abc\Components\Training;

/**
* Класс Traning
*
* NOTE: Requires PHP version 5.5 or later
*
@author phpforum.su
*
@copyright © 2015
*
@license http://www.wtfpl.net/
*/
class Training
{
/**
*
@var ABC\Abc\Components\TraningExample\TraningExample
*/

public $example;

/**
* Конструктор
*
*
@param array $data
*/

public function __construct($data = [])
{
// Здесь настройки из конфигурационного файла
}

public function display()
{
echo $this->example->getText();
}
}


Второй
<?php

namespace ABC\Abc\Components\TrainingExample;

/**
* Класс TraningExample
*
* NOTE: Requires PHP version 5.5 or later
*
@author phpforum.su
*
@copyright © 2015
*
@license http://www.wtfpl.net/
*/
class TrainingExample
{
/**
* Конструктор
*
*
@param array $data
*/

public function __construct($data = [])
{
// Здесь настройки из конфигурационного файла
}

public function getText()
{
return 'Привет, Мир!';
}
}


Теперь правила построения билдера.

1. Билдеры располагаются в папке Builders
2. Название билдера должно соответствовать названию сервиса с постфиксом Builder
Пример: TrainingBuilder
3. Каждый билдер должен быть унаследован от основного билдера.
4. В билдере обязателен метод buildService (что прописано контрактом в родителе).
5. Этот метод должен принимать параметр $global с булевым значением, на основе которого решается способ хранения сервиса
6. Зависимости должны внедряться только серез публичные свойства или сеттеры.
7. В конструктор обязательно должны передаваться настройки конфигурации, даже если они там не нужны.
8. Вобщем то и всё пока.

Вот пример билдера:
<?php

namespace ABC\Abc\Builders;

use ABC\Abc\Builders\AbcBuilder;

// Требующиеся дополнительные компоненты
use ABC\Abc\Components\TrainingExample\TrainingExample;

/**
* Класс MysqliBuilder
*
* NOTE: Requires PHP version 5.5 or later
*
@author phpforum.su
*
@copyright © 2015
*
@license http://www.wtfpl.net/
*/

class TraningBuilder extends AbcBuilder
{
/**
*
@var array
*/

protected $service = 'Training'; // <-- Это имя сервиса

/**
* Строит сервис.
*
*
@return void
*/

protected function buildService($global = false)
{ // Формируем путь до компонента
$component = '\ABC\abc\components\\'. $this->service .'\\'. $this->service;
// Получаем из конфиги необходимые настройки
$data = @$this->config[$this->service] ?: [];
// Здесь решаем, каким должен быть сервис. Глобальным (по приципу Singletone)
// Или обычным, когда при каждом обращении формируются новые объекты

$typeService = $global ? 'setGlobal' : 'set';
// Помещаем сервис в локатор в виде анонимной функции
$this->locator->$typeService(
$this->service, // <--- Это название сервиса
function() use ($component, $data) {// <--- Передаем в функцию имя компонента и настройки конфигурации
// Подготавливаем к запуску интерфейс основного компонента

$obj = new $component($data);
// Тут добавляем к данным дополнительные объекты
$obj->example = new TrainingExample;
// Когда будет вызвана функция, будет создан и возвращен объект основного компонента
// с переданными ему настройками и объектами других компонентов в виде зависимостей

return $obj;
}
);
}
}


Всё это работает в фреймворке, можно посмотреть здесь.

Сервис вызывается примерно так:
Abc::getService('Traning')->display();

Это должно выдать вожделенный "Привет, Мир!" :)


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

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

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

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

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



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 29455
На форуме: 5 лет, 3 месяца, 3 дня
Карма: 1




я так понял это у меня интерфэйс


namespace ABC\Abc\Components\Converter;

use ABC\abc\Components\Converter\Yaml;
class Converter {
// пока не знаю редактор выдает (неправильный namespace)
// /**
// * @var ABC\Abc\Components\Converter\Yaml
// */
// public $yaml;

/**
* конвертируем Json документ(строку) в массив php
*
@param $json
*
@return mixed|string
*/


public function parseJson($json)
{
if(!$json_dec = json_decode($json)) {

switch (json_last_error()) {
case JSON_ERROR_DEPTH:
return ' - Достигнута максимальная глубина стека';
break;
case JSON_ERROR_STATE_MISMATCH:
return ' - Некорректные разряды или не совпадение режимов';
break;
case JSON_ERROR_CTRL_CHAR:
return ' - Некорректный управляющий символ';
break;
case JSON_ERROR_SYNTAX:
return ' - Синтаксическая ошибка, не корректный JSON';
break;
case JSON_ERROR_UTF8:
return ' - Некорректные символы UTF-8, возможно неверная кодировка';
break;
default:
return ' - Неизвестная ошибка';
break;
}
}

return $json_dec;
}

/**
* конвертируем XML документ(строку) в массив php
*
@param $str_xml
*
@return \SimpleXMLElement
*
@throws \Exception
*/

public function parseXML($str_xml)
{
if(!$xml_dec = new \SimpleXMLElement($str_xml))
{
throw new \Exception('Не верный формат XML.');
}
return $xml_dec;
}

/**
* конвертируем Yaml документ(строку) в массив php
*
@param $str_yaml
*
@return mixed
*/

public function parseYAML($str_yaml)
{
$yaml = new Yaml();
return $yaml->parser($str_yaml);
}
}




это класс конвертации yaml

namespace ABC\abc\Components\Converter;
/**
* Created by PhpStorm.
* User: pamparam
* Date: 26.10.2015
* Time: 16:12
*/

class Yaml
{
/**
* Очищаем Yaml строки от маркеров и комментариев в начале и в конце
*
*
@param string $value The input YAML string
*
*
@return string A cleaned up YAML string
*/

private function cleanup($value)
{
$value = str_replace(["\r\n", "\r"], "\n", $value);
// очищаем YAML шапку
$value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value);

// удаляем комментарии
$value = preg_replace('#^(\#.*?\n)+#s', '', $value);

// удаляем маркер (---)
$value = preg_replace('#^\-\-\-.*?\n#s', '', $value);

// удаляем маркер (...)
$value = preg_replace('#\.\.\.\s*$#', '', $value);
return $value;
}
/**
* массив из строк Yaml
*
@param $str
*
@return array
*/

public function arrayLine($str)
{
$yaml = [];

$line = explode("\n", $str);
$space = 'false';

foreach ($line as $value) {
if (!empty($value)) {
// отлавливаем табуляцию
if (preg_match('#[\t]+#', $value)) {
throw new \Exception("Никогда не используйте табуляцию (tab), пользоваться нужно пробелами");
}
// считаем пробелы в строке
$count_space = strspn($value, ' ');

// ищим дефис в строке
if (preg_match('#^-#', $value)) {
$value = preg_replace('#^-#', ' ', $value);
$space = 'true';
}
// записываем массив
$yaml[] = [$count_space, $space, trim($value)];
}
}


return $yaml;
}

/**
* получаем одномерный массив
*
@param $str
*
@return array
*/


public function parser($str)
{
// очищаем и делаем массив
$strline = $this->cleanup($str);
return $this->arrayLine($strline);
}
}


Вопрос какие настройки в конструкторе?
конструктор должен быть в двух классах?

и связь между классами определяется через открытое свойство
навроде этого?
Цитата (twin @ 28.10.2015 - 19:06)
/**
    * @var ABC\Abc\Components\TraningExample\TraningExample
    */
public $example;


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

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



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

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

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


Давай сразу к стилю привыкать. Вот почитай PSR. По русски даже есть.
<?php
// Обязательна пустая строка
namespace ABC\Abc\Components\Converter;
// Здесь тоже
use ABC\abc\Components\Converter\Yaml;

/**
* Converter
*
* NOTE: Requires PHP version 5.5 or later
*
@author phpforum.su
*
@copyright © 2015
*
@license http://www.wtfpl.net/
*/
class Converter
{//<-- Скобка у класса тут

/**
*
@var ABC\Abc\Components\Converter\Yaml
*/

public $yaml;

/**
* конвертируем Json документ(строку) в массив php
*
@param $json
*
@return mixed|string
*/

public function parseJson($json)
{//Отступы в 4 пробела
if(!$json_dec = json_decode($json)) {

switch (json_last_error()) {
case JSON_ERROR_DEPTH :
return ' - Достигнута максимальная глубина стека';
//break; <-- брэк не нужен, если есть ретурн

case JSON_ERROR_STATE_MISMATCH :
return ' - Некорректные разряды или не совпадение режимов';

case JSON_ERROR_CTRL_CHAR :
return ' - Некорректный управляющий символ';

case JSON_ERROR_SYNTAX :
return ' - Синтаксическая ошибка, не корректный JSON';

case JSON_ERROR_UTF8 :
return ' - Некорректные символы UTF-8, возможно неверная кодировка';

default:
return ' - Неизвестная ошибка';

}
}

return $json_dec;
}

/**
* конвертируем XML документ(строку) в массив php
*
@param $str_xml
*
@return \SimpleXMLElement
*
@throws \Exception
*/

public function parseXML($str_xml)
{
if(!$xml_dec = new \SimpleXMLElement($str_xml))
{
throw new \Exception('Не верный формат XML.');
}
return $xml_dec;
}

/**
* конвертируем Yaml документ(строку) в массив php
*
@param $str_yaml
*
@return mixed
*/

public function parseYAML($str_yaml)
{
$yaml = new Yaml();
return $yaml->parser($str_yaml);
}
}



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

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

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

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

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



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

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1045
Пользователь №: 41686
На форуме: 1 год, 3 месяца, 29 дней
Карма: 13




немного оффтопик. Все же на какой популярный фреймворк наиболее всего будет похож ABC? Сейчас меня интересует Symfony, если честно...


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

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



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

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

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


Дальше. В онтерфейсе компонента должно быть только управление, если есть разные подсистемы.

В конструктор нужно передать настройки. Этот компонент пока не нуждается во внешних зависимостях, по этому как то так:
<?php

namespace ABC\Abc\Components\Converter;

use ABC\abc\Components\Converter\Yaml;

/**
* Converter
*
* NOTE: Requires PHP version 5.5 or later
*
@author phpforum.su
*
@copyright © 2015
*
@license http://www.wtfpl.net/
*/
class Converter
{
/**
*
@var string
*/

public $language;

/**
* Конструктор
*
*
@param $language
*
*/

protected function __construct($language = null)
{
if (empty($language)) {
trigger_error(ABC_INVALID_ARGUMENT_EX
.'Component Converter: no language settings',
E_USER_WARNING);
} else {
$this->language = strtolower($language);
}
}


/**
* конвертируем XML документ(строку) в массив php
*
*
@param $content
*
*
@return array
*/

public function parse($content)
{
switch ((string)$this->language) {
case 'xml' :
return $this->parseXml($content);
case 'yaml' :
return $this->parseYaml($content);
case 'json' :
return $this->parseJson($content);
default :
trigger_error(ABC_INVALID_ARGUMENT_EX
.'Component Converter: unknown language '. $content,
E_USER_WARNING);
return false;
}
}


/**
* конвертируем Yaml документ(строку) в массив php
*
*
@param string $content
*
*
@return mixed
*/

protected function parseYaml($content)
{
$yaml = new Yaml();
return $yaml->parser($content);
}

// Ну и так далее.
}


Обрати внимание на уровни доступа. То, что не нужно снаружи, должно объявляться protected

И эксепшены в фреймворке использовать не будем. Зря я чтоли карпел над преобразователем)))

Eсть вопросы?


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

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

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

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

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



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

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

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


Цитата (Ron @ 29.10.2015 - 17:30)
немного оффтопик. Все же на какой популярный фреймворк наиболее всего будет похож ABC? Сейчас меня интересует Symfony, если честно..

Symfony тоже построена на SOA, но куда нам до неё. Там сплошной оверинжениринг. Ни на что не будет похож. biggrin.gif Самостийный будет.


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

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

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

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

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



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 29455
На форуме: 5 лет, 3 месяца, 3 дня
Карма: 1




Цитата (twin @ 29.10.2015 - 17:46)
И эксепшены в фреймворке использовать не будем. Зря я чтоли карпел над преобразователем)))


Да я видел твою новую тему, и пон что нужно уже иначе писать)))
Цитата (twin @ 29.10.2015 - 17:46)
Обрати внимание на уровни доступа. То, что не нужно снаружи, должно объявляться protected

про них я знаю просто пока не могу за всем сразу уследить, (туго соображаю) сначала пишу потом разбираю.. .. буду внимательней
Цитата (twin @ 29.10.2015 - 17:46)
Eсть вопросы?


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

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

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