Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Class ParserManager
- * менеджер парсинга. в нем реализуется управление от получения текста до возврата отформатированного
- * и обработанного массива данных
- */
- class ParserManager
- {
- /**
- * @var ParserProcessor[]
- */
- private $processors;
- /**
- * @var string
- */
- private $inputText;
- /**
- * @var Match
- */
- private $match;
- /**
- * ParserManager constructor.
- * @param array $processors
- * @param string $inputText
- * @param Match $match
- * @throws Exception
- */
- public function __construct(array $processors, string $inputText, Match $match)
- {
- $this->processors = $processors;
- $this->inputText = $inputText;
- $this->match = $match;
- if (empty($this->inputText) || is_null($this->match)) {
- throw new \Exception();
- }
- }
- /**
- * получает на входе текст, подбирает для него парсер, создает его инстанс, парсит
- * далее, если есть дополнительные обработчики разпаршенных данных, по ним прогоняет массив данных
- * и возвращает данный массив, который отображается на фронте
- * Процессоры, как вариант, можно делать не общие, а цеплять к конкретному парсеру.
- * @return array
- */
- public function parse(): ?array
- {
- $parser = $this->getParser();
- if (is_null($parser)) {
- return null;
- }
- $data = $parser->parse();
- if (!empty($this->processors)) {
- foreach ($this->processors as $processor) {
- $processor->process($data);
- }
- }
- return $data;
- }
- /**
- * на основе текста подбирает нужный парсер для разбора
- * @return Parser|null
- */
- private function getParser(): ?Parser
- {
- foreach (Parser::getAll() as $parser) {
- if ($parser->detect($this->inputText)) {
- return $parser;
- }
- }
- return null;
- }
- }
- /**
- * Interface IParser
- * Интерфейс для парсеров конкретных ресурсов
- */
- interface IParser
- {
- /**
- * на основе текста определяет, может ли данный парсер обработать данный текст
- * @return bool
- */
- public function detect(): bool;
- /**
- * непосредственная логика разбора текста и преобразование его в стандартный массив данных;
- * все парсеры обязаны вернуть массив в согласованном формате, который будут понимать
- * остальные классы модуля.
- * @return array
- */
- public function parse(): array;
- }
- /**
- * Class Parser
- * конкретный парсер
- */
- abstract class Parser implements IParser
- {
- /** @var string */
- private $inputText;
- /**
- * Parser constructor.
- * @param string $inputText
- */
- public function __construct(string $inputText)
- {
- $this->inputText = $inputText;
- }
- public static function getAll(): array
- {
- return [];
- }
- }
- /**
- * Class ParserProcessor
- * дополнительный обработчик данных, полученых от парсера. Например понадобится дополнить
- * массив данных дополнительными данными, сделать дополнительные сопоставление и так далее.
- * вся эта логика будет тут сосредоточена. Обработчиков может бытт бесконечное множество.
- * Как вариант, обработчики можно привязывать к конкретным парсерам.
- */
- class ParserProcessor
- {
- public function process(Match $match, array &$data): void
- {
- }
- }
- /**
- * Class ParseDataSaverManager
- * менеджер сохранения данных парсера.
- * порядок такой - менеджер парсеров парсит данных, делает их обработки, отдает данные на фронт
- * пользователь редактирует эти данные, подставляет. нажимает сохранить, и вот этот менеджер сериализации
- * пишет данные уже в базу. Логика записи будет распределена по классам сериализаторам. Это нужно
- * на случай, если логика сохраения будет отличаться между видами спорта - нужны будут свои пересчеты и так далее.
- */
- class ParseDataSaverManager
- {
- private $savers;
- private $data;
- /**
- * ParseDataSerializerManager constructor.
- * @param IParserDataSaver[] $savers
- * @param $data
- */
- public function __construct(array $savers, $data)
- {
- $this->savers = $savers;
- $this->data = $data;
- }
- /**
- * @param $data
- * @return bool
- */
- public function save($data): bool
- {
- $ok = 1;
- foreach ($this->savers as $saver) {
- $ok &= $saver->save($data);
- }
- return $ok;
- }
- }
- /**
- * Interface IParserDataSerializer
- * сериализатор данных
- */
- interface IParserDataSaver
- {
- public function save($data);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement