> */ private static array $parsers = [ VrtArticleParser::class, BelgaArticleParser::class, ]; /** * @throws Exception */ public static function getParser(string $url): ArticleParserInterface { foreach (self::$parsers as $parserClass) { $parser = new $parserClass(); if ($parser->canParse($url)) { return $parser; } } throw new Exception("No parser found for URL: {$url}"); } public static function getParserForFeed(Feed $feed, string $parserType = 'article'): ?ArticleParserInterface { if (!$feed->provider) { return null; } $providerConfig = config("feed.providers.{$feed->provider}"); if (!$providerConfig || !isset($providerConfig['parsers'][$parserType])) { return null; } $parserClass = $providerConfig['parsers'][$parserType]; if (!class_exists($parserClass)) { return null; } return new $parserClass(); } /** * @return array */ public static function getSupportedSources(): array { return array_map(function($parserClass) { $parser = new $parserClass(); return $parser->getSourceName(); }, self::$parsers); } /** * @param class-string $parserClass */ public static function registerParser(string $parserClass): void { if (!in_array($parserClass, self::$parsers)) { self::$parsers[] = $parserClass; } } }