Files
portal/app/app/Services/Autopodbor/Agent/Extract/TwoGisReader.php
T
Дмитрий 46426d586e feat(autopodbor): шов TwoGisReader + HtmlTwoGisReader + TwoGisJsonReader (TDD)
Фазы 2-3 плана self-render. Только новые файлы — существующий код не тронут,
xf4-путь цел. 281/281 юнит-тестов зелёные, Pint чисто.

- TwoGisReader — интерфейс разбора 2ГИС (3 метода: listing/card/branchList),
  единый контракт поверх HTML (xf4) ИЛИ initialState-JSON (self-render).
- HtmlTwoGisReader — xf4-путь: тонкий делегат к CategoryListingParser/
  DirectoryParser, поведение 1:1 (4 теста контракт-идентичности на реальных
  фикстурах 2gis-*-kraslombard).
- TwoGisJsonReader — self-render путь: разбор window.initialState по карте
  путей спайка (pagination-список → entity.profile), фильтр type=branch
  (фирма-в-фирму, без зданий/улиц). 5 тестов на реальных фикстурах: 12 фирм
  листинга, телефон+сайт карточки, 2 пути поиска-по-телефону, деградация.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:40:39 +03:00

38 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Services\Autopodbor\Agent\Extract;
use App\Services\Autopodbor\Agent\Fetch\DirectoryCard;
/**
* Шов разбора 2ГИС: единый контракт поверх «сырья» страницы (HTML от xf4 ИЛИ initialState-JSON
* от своего рендера). Реализации: {@see HtmlTwoGisReader} (xf4-путь, делегирует старым парсерам) и
* {@see TwoGisJsonReader} (self-render, разбирает initialState). Выход по форме идентичен нынешним
* парсерам, поэтому потребители (шаг 1/2, разворот) не замечают разницы источника.
*/
interface TwoGisReader
{
/**
* Список фирм со страницы поиска-рубрики (как {@see CategoryListingParser::parse}).
*
* @return list<array{name:string,card_url:string,site:?string}>
*/
public function listing(string $payload): array;
/**
* Карточка фирмы: телефоны+сайт+описание (как {@see DirectoryParser::parse2gisCard}).
*
* @return list<DirectoryCard>
*/
public function card(string $payload, string $url): array;
/**
* Пути карточек филиалов со страницы списка/поиска (как {@see DirectoryParser::parseBranchList}).
*
* @return list<string>
*/
public function branchList(string $payload): array;
}