Files
portal/app/app/Services/Autopodbor/Agent/Extract/HtmlTwoGisReader.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

39 lines
1.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Services\Autopodbor\Agent\Extract;
use App\Services\Autopodbor\Agent\ChannelA\CategoryListingParser;
use App\Services\Autopodbor\Agent\Fetch\DirectoryCard;
/**
* xf4-путь шва {@see TwoGisReader}: тонкий делегат к нынешним HTML-парсерам. Поведение 1:1 с прямым
* вызовом {@see CategoryListingParser}/{@see DirectoryParser} — старые парсеры не трогаются, xf4-путь
* остаётся целым. Развилка HTML↔JSON — на уровне провайдера (какой ридер инжектится), не внутри парсеров.
*/
final class HtmlTwoGisReader implements TwoGisReader
{
public function __construct(
private readonly CategoryListingParser $listing = new CategoryListingParser,
private readonly DirectoryParser $directory = new DirectoryParser,
) {}
public function listing(string $payload): array
{
return $this->listing->parse($payload);
}
/** @return list<DirectoryCard> */
public function card(string $payload, string $url): array
{
return $this->directory->parse2gisCard($payload, $url);
}
/** @return list<string> */
public function branchList(string $payload): array
{
return $this->directory->parseBranchList($payload);
}
}