2025-06-29 21:33:18 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Services\Factories;
|
|
|
|
|
|
|
|
|
|
use App\Contracts\ArticleParserInterface;
|
|
|
|
|
use App\Services\Parsers\VrtArticleParser;
|
2025-06-29 21:39:28 +02:00
|
|
|
use App\Services\Parsers\BelgaArticleParser;
|
2025-06-29 21:33:18 +02:00
|
|
|
use Exception;
|
|
|
|
|
|
|
|
|
|
class ArticleParserFactory
|
|
|
|
|
{
|
2025-07-07 00:51:32 +02:00
|
|
|
/**
|
|
|
|
|
* @var array<int, class-string<ArticleParserInterface>>
|
|
|
|
|
*/
|
2025-06-29 21:33:18 +02:00
|
|
|
private static array $parsers = [
|
|
|
|
|
VrtArticleParser::class,
|
2025-06-29 21:39:28 +02:00
|
|
|
BelgaArticleParser::class,
|
2025-06-29 21:33:18 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
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}");
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-07 00:51:32 +02:00
|
|
|
/**
|
|
|
|
|
* @return array<int, string>
|
|
|
|
|
*/
|
2025-06-29 21:33:18 +02:00
|
|
|
public static function getSupportedSources(): array
|
|
|
|
|
{
|
|
|
|
|
return array_map(function($parserClass) {
|
|
|
|
|
$parser = new $parserClass();
|
|
|
|
|
return $parser->getSourceName();
|
|
|
|
|
}, self::$parsers);
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-07 02:48:46 +02:00
|
|
|
/**
|
|
|
|
|
* @param class-string<ArticleParserInterface> $parserClass
|
|
|
|
|
*/
|
2025-06-29 21:33:18 +02:00
|
|
|
public static function registerParser(string $parserClass): void
|
|
|
|
|
{
|
|
|
|
|
if (!in_array($parserClass, self::$parsers)) {
|
|
|
|
|
self::$parsers[] = $parserClass;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|