furkay Her bir dosya türü için parser yazmanız lazım, bir tane de data transformer olacak, tüm dosyalardan veriyi istediğiniz formatta almanızı sağlayacak. Örneğin bu dosyalardan id ve name alacaksınız ama her dosyada farklı yapıda, farklı tanımlanmış ve değişken isimleri de farklı olsun. Kimisinde name yerine username, kimisinde id yerine user_id kimisinde alt dizilerde vs...
abstract class Parser
{
public const TYPE1 = 1;
public const TYPE2 = 2;
public const TYPE3 = 2;
public function getData(string $url): array
{
return json_decode(file_get_contents($json_url, true));
}
abstract public function handle(string $url): DataTransformer;
}
class DataTransformer
{
public function __construct(
public int $id,
public string $name
)
{}
}
class Parser1 extends Parser
{
public function handle(string $url): DataTransformer
{
$data = $this->getData($url);
// İşte burada veriyi standartlaştırıyoruz. id ve name alanlarını çözümleyip
// transformer'a gönderiyorum. Her dosya için farklı olabilir:
$id = (int)$data['userid']
$name = $data['customer']['name'];
// ama sonuçta ne olursa olsun hep aynı şey dönmeli:
return new DataTransformer($id, $name);
}
}
Aynı şekilde her bir json dosya yapısı için bir parser ekleyeceksiniz ve handle yöntemi içinde id ve name alanını elde etmeye çalışıp üstteki gibi bir DataTransformer döneceksiniz:
class Parser2 extends Parser
{}
class Parser3 extends Parser
{}
Buna bir tane de manager yazalım. Bu da tipe göre veriyi almamızı sağlacak:
class JsonUserParser
{
public function parse(int $type, $url): DataTransformer
{
return match($type) {
Parser::TYPE1 => (new Parser1)->parse($url),
Parser::TYPE2 => (new Parser2)->parse($url),
Parser::TYPE3 => (new Parser3)->parse($url),
default => throw new InvalidArgumentException("Geçersiz tip. Sadece 1, 2 ya da 3 olabilir")
}
}
}
Artık şöyle kullanabilirsiniz:
public function getDataFromJson(): array
{
$url1 = '...'; // 1 tipinde json dosyası diyelim
$url2 = '...'; // 2 tipinde json dosyası diyelim
$url3 = '...'; // 3 tipinde json dosyası diyelim
return [
(new JsonUserParser)->parse(Parser::TYPE1, $url1),
(new JsonUserParser)->parse(Parser::TYPE2, $url2),
(new JsonUserParser)->parse(Parser::TYPE3, $url3),
];
}
Bu getDataFromJson yöntemi içinde DataTransformer'lar olan bir dizi dönecek. Ben bu veriyi kullanmak istersem mesela:
$usersFromJson = $service->getDataFromJson();
foreach($usersFromJson as $user) {
// Artık burada $user->id ve $user->name şeklinde veriye erişebilirsiniz.
}