Advertisement
Guest User

Untitled

a guest
Jan 24th, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.98 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Class ParserManager
  5.  * менеджер парсинга. в нем реализуется управление от получения текста до возврата отформатированного
  6.  * и обработанного массива данных
  7.  */
  8. class ParserManager
  9. {
  10.     /**
  11.      * @var ParserProcessor[]
  12.      */
  13.     private $processors;
  14.  
  15.     /**
  16.      * @var string
  17.      */
  18.     private $inputText;
  19.  
  20.     /**
  21.      * @var Match
  22.      */
  23.     private $match;
  24.  
  25.     /**
  26.      * ParserManager constructor.
  27.      * @param array $processors
  28.      * @param string $inputText
  29.      * @param Match $match
  30.      * @throws Exception
  31.      */
  32.     public function __construct(array $processors, string $inputText, Match $match)
  33.     {
  34.         $this->processors = $processors;
  35.         $this->inputText = $inputText;
  36.         $this->match = $match;
  37.  
  38.          if (empty($this->inputText) || is_null($this->match)) {
  39.              throw new \Exception();
  40.          }
  41.     }
  42.  
  43.     /**
  44.      * получает на входе текст, подбирает для него парсер, создает его инстанс, парсит
  45.      * далее, если есть дополнительные обработчики разпаршенных данных, по ним прогоняет массив данных
  46.      * и возвращает данный массив, который отображается на фронте
  47.      * Процессоры, как вариант, можно делать не общие, а цеплять к конкретному парсеру.
  48.      * @return array
  49.      */
  50.     public function parse(): ?array
  51.     {
  52.         $parser = $this->getParser();
  53.         if (is_null($parser)) {
  54.             return null;
  55.         }
  56.         $data = $parser->parse();
  57.         if (!empty($this->processors)) {
  58.             foreach ($this->processors as $processor) {
  59.                 $processor->process($data);
  60.             }
  61.         }
  62.         return $data;
  63.     }
  64.  
  65.     /**
  66.      * на основе текста подбирает нужный парсер для разбора
  67.      * @return Parser|null
  68.      */
  69.     private function getParser(): ?Parser
  70.     {
  71.         foreach (Parser::getAll() as $parser) {
  72.             if ($parser->detect($this->inputText)) {
  73.                 return $parser;
  74.             }
  75.         }
  76.         return null;
  77.     }
  78. }
  79.  
  80. /**
  81.  * Interface IParser
  82.  * Интерфейс для парсеров конкретных ресурсов
  83.  */
  84. interface IParser
  85. {
  86.     /**
  87.      * на основе текста определяет, может ли данный парсер обработать данный текст
  88.      * @return bool
  89.      */
  90.     public function detect(): bool;
  91.  
  92.     /**
  93.      * непосредственная логика разбора текста и преобразование его в стандартный массив данных;
  94.      * все парсеры обязаны вернуть массив в согласованном формате, который будут понимать
  95.      * остальные классы модуля.
  96.      * @return array
  97.      */
  98.     public function parse(): array;
  99. }
  100.  
  101. /**
  102.  * Class Parser
  103.  * конкретный парсер
  104.  */
  105. abstract class Parser implements IParser
  106. {
  107.     /** @var string */
  108.     private $inputText;
  109.  
  110.     /**
  111.      * Parser constructor.
  112.      * @param string $inputText
  113.      */
  114.     public function __construct(string $inputText)
  115.     {
  116.         $this->inputText = $inputText;
  117.     }
  118.  
  119.     public static function getAll(): array
  120.     {
  121.         return [];
  122.     }
  123. }
  124.  
  125.  
  126. /**
  127.  * Class ParserProcessor
  128.  * дополнительный обработчик данных, полученых от парсера. Например понадобится дополнить
  129.  * массив данных дополнительными данными, сделать дополнительные сопоставление и так далее.
  130.  * вся эта логика будет тут сосредоточена. Обработчиков может бытт бесконечное множество.
  131.  * Как вариант, обработчики можно привязывать к конкретным парсерам.
  132.  */
  133. class ParserProcessor
  134. {
  135.     public function process(Match $match, array &$data): void
  136.     {
  137.     }
  138. }
  139.  
  140.  
  141. /**
  142.  * Class ParseDataSaverManager
  143.  * менеджер сохранения данных парсера.
  144.  * порядок такой - менеджер парсеров парсит данных, делает их обработки, отдает данные на фронт
  145.  * пользователь редактирует эти данные, подставляет. нажимает сохранить, и вот этот менеджер сериализации
  146.  * пишет данные уже в базу. Логика записи будет распределена по классам сериализаторам. Это нужно
  147.  * на случай, если логика сохраения будет отличаться между видами спорта - нужны будут свои пересчеты и так далее.
  148.  */
  149. class ParseDataSaverManager
  150. {
  151.     private $savers;
  152.     private $data;
  153.  
  154.     /**
  155.      * ParseDataSerializerManager constructor.
  156.      * @param IParserDataSaver[] $savers
  157.      * @param $data
  158.      */
  159.     public function __construct(array $savers, $data)
  160.     {
  161.         $this->savers = $savers;
  162.         $this->data = $data;
  163.     }
  164.  
  165.     /**
  166.      * @param $data
  167.      * @return bool
  168.      */
  169.     public function save($data): bool
  170.     {
  171.         $ok = 1;
  172.         foreach ($this->savers as $saver) {
  173.             $ok &= $saver->save($data);
  174.         }
  175.         return $ok;
  176.     }
  177. }
  178.  
  179. /**
  180.  * Interface IParserDataSerializer
  181.  * сериализатор данных
  182.  */
  183. interface IParserDataSaver
  184. {
  185.     public function save($data);
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement