Merhaba, bir proje üzerinde çalışıyorum. Proje temelinde şöyle çalışıyor; kullanıcı formu doldurup kaydediyor, kayıt işlemi sonrası ilgili model ile job oluşturup kuyruğa atıyorum. Kuyruk da isteği işleyip API üzerinden 3. parti bir servise gönderiyor. Kodlar da şöyle:
Client:
<?php
...
class UetdsClient
{
public function seferEkle(array $values): stdClass
{
return $this->client->seferEkle([
'wsuser' => [
'kullaniciAdi' => $this->username,
'sifre' => $this->password,
],
'ariziSeferBilgileriInput' => $values
]);
}
public function seferGuncelle(string $referenceNo, array $values): stdClass
{
return $this->client->seferGuncelle([
'wsuser' => [
'kullaniciAdi' => $this->username,
'sifre' => $this->password,
],
'guncellenecekSeferReferansNo' => $referenceNo,
'ariziSeferBilgileriInput' => $values
]);
}
...
Service:
<?php
...
class UetdsService
{
private UetdsClient $client;
public function __construct(UetdsClient $uetdsClient)
{
$this->client = $uetdsClient;
}
private function response(stdClass $response, ?string $key = null): string|bool|array|stdClass
{
if ($response->return->sonucKodu == 0) {
if ($key) {
if (isset($response->return->$key)) {
if (!is_string($response->return->$key) && !is_array($response->return->$key) && !is_bool($response->return->$key)) {
$response->return->$key = json_decode(json_encode($response->return->$key));
}
return $response->return->$key;
}
}
return true;
} else {
throw new Exception($response->return->sonucMesaji);
}
}
public function addTrip(UetdsNotification $uetdsNotification): string
{
$uetdsNotification->load(['vehicleVersion']);
$values = [
'aracPlaka' => $uetdsNotification->vehicleVersion->licence_plate,
'hareketTarihi' => $uetdsNotification->start_date->format('Y-m-d'),
'hareketSaati' => $uetdsNotification->start_date->format('H:i'),
'seferAciklama' => $uetdsNotification->description,
'aracTelefonu' => $uetdsNotification->phone,
'firmaSeferNo' => $uetdsNotification->trip_number,
'seferBitisTarihi' => $uetdsNotification->end_date->format('Y-m-d'),
'seferBitisSaati' => $uetdsNotification->end_date->format('H:i'),
];
$response = $this->client->seferEkle($values);
return $this->response($response, 'uetdsSeferReferansNo');
}
public function updateTrip(UetdsNotification $uetdsNotification): string
{
$uetdsNotification->load(['vehicleVersion']);
$values = [
'aracPlaka' => $uetdsNotification->vehicleVersion->licence_plate,
'hareketTarihi' => $uetdsNotification->start_date->format('Y-m-d'),
'hareketSaati' => $uetdsNotification->start_date->format('H:i'),
'seferAciklama' => $uetdsNotification->description,
'aracTelefonu' => $uetdsNotification->phone,
'firmaSeferNo' => $uetdsNotification->trip_number,
'seferBitisTarihi' => $uetdsNotification->end_date->format('Y-m-d'),
'seferBitisSaati' => $uetdsNotification->end_date->format('H:i'),
];
$response = $this->client->seferGuncelle($uetdsNotification->reference_no, $values);
return $this->response($response, 'uetdsSeferReferansNo');
}
...
Job:
<?php
...
class ProcessUetdsNotification implements ShouldQueue
{
use Queueable;
public $tries = 3;
public $backoff = 3;
public function __construct(
public UetdsNotification $uetdsNotification
) {}
public function handle(UetdsService $uetdsService): void
{
if ($this->uetdsNotification->reference_no !== null) {
$referenceNo = $uetdsService->updateTrip($this->uetdsNotification);
} else {
$referenceNo = $uetdsService->addTrip($this->uetdsNotification);
}
foreach ($this->uetdsNotification->personnelsWithTrashed as $personnel) {
// Personel bildirim bekliyorsa
if ($personnel->status == UetdsNotificationStatusEnum::WAITING->value) {
// Personeli sil
ProcessUetdsDeletePersonnelNotification::dispatch($personnel);
// Personel sistemde silinmediyse güncellenmiştir, personeli ekle.
// UETDS sisteminde personel güncelleme ile ilgili herhangi bir endpoint olmadığı için bu şekilde yapıyoruz.
if ($personnel->deleted_at == null) {
ProcessUetdsAddPersonnelNotification::dispatch($personnel);
}
}
}
foreach ($this->uetdsNotification->groupsWithTrashed as $group) {
if ($group->status == UetdsNotificationStatusEnum::WAITING->value) {
ProcessUetdsGroupNotification::dispatch($group);
}
}
$this->uetdsNotification->update([
'reference_no' => $referenceNo,
'status' => UetdsNotificationStatusEnum::COMPLETED->value
]);
}
public function failed($exception)
{
$this->uetdsNotification->update([
'status' => UetdsNotificationStatusEnum::FAILED->value
]);
//LOGGING?
}
}
Sormak istediğim şu; ben, kullanıcı formu kaydettikten sonra Job oluşturuyorum. Bu Job içinde de bi business logic dönüyor. Bu yaklaşım bana doğru gelmedi ama ekstra bir layer da oluşturmalı mıyım karar veremedim.
Sizce ne yapabilirim? Önerilere açığım.
Ayrıca verdiğim kodlarda metot içlerinde değiştirmem, yanlış yaptığım bir şey varsa onları da duymak isterim.