46426d586e
Фазы 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>
39 lines
1.4 KiB
PHP
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);
|
|
}
|
|
}
|