Merhabalar,
Laravel 6.5.2 ile geliştirdiğim bir projede şöyle bir sorunla karşılaştım;
DB ile transaction başlatıyorum, işlemlerimi yapıyorum ve sorun çıkmazsa commit ediliyor.
Yalnız ilgili işlemlerde created event tetiklenmiyor. Kayıt işlemini DB ile değil model ile yapınca event tetikleniyor fakat bu defa da çok fazla yönlendiriliyorsunuzu hatası alıyorum.
Transaction kullanmam lazım, created event i de tetiklemem lazım. İkisinden de vazgeçemiyorum.
İlgili kodları aşağıda paylaşıyorum;
SurveyController.php içinde answerStore isimli method;
`
public function answerStore($slug, ResponderRequest $request)
{
try {
$survey = $this->surveyContract->show($slug);
// Pollster verisi varsa onun id değerini alıyoruz. Yoksa null olarak veriyoruz.
$pollster_id = null;
if ($request->has("pollster")) {
$pollster_id = Pollster::where("id", $request->get("pollster"))->first()->id ?? null;
}
$answers = $request->except(["_token", "name", "email", "phone", "address"]);
$responder = array_merge(
$request->only(["name", "email", "phone", "address"]),
["survey_id" => $survey->id, "ip_address" => $_SERVER["REMOTE_ADDR"], "pollster_id" => $pollster_id]
);
// Gelen verileri validate ediyoruz. Bir hata varsa hatayı kullanıcıya return ediyoruz.
$validate = $this->answerValidate->check($survey->question, $answers);
if (!$validate["status"]) {
return redirect()->back()->withErrors("Bir hata oluştu. Hata mesajı = " . $validate["message"]);
}
$save = $this->surveyContract->storeResponderAndAnswers($responder, $answers);
if (!$save) {
throw new \Exception("Kayıt sırasında bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.");
}
return redirect()->back()->withSuccess("Cevaplar başarılı şekilde kaydedildi. Ankete katıldığınız için teşekkürler.");
} catch (\Exception $error) {
return redirect()->back()->withErrors("Cevaplar kaydedilirken bir hata oluştu. Hata sistem yöneticisine bildirildi. Lütfen daha sonra tekrar deneyiniz.");
}
}
`
SurveyRepository.php içinde storeResponderAndAnswers isimli method;
`
public function storeResponderAndAnswers($responder, $answers): bool
{
// TODO: Implement storeResponderAndAnswers() method.
try {
DB::beginTransaction();
$responder_id = DB::table("responders")->insertGetId($responder);
//$responder_id = Responder::create($responder)->id;
foreach ($answers as $key => $answer) {
if (!is_array($answer)) {
DB::table("question_answers")->insertGetId([
"question_id" => $key,
"option_id" => null,
"responders_id" => $responder_id,
"answer" => $answer,
]);
} else {
foreach ($answer as $subKey => $item) {
if ($item) {
DB::table("question_answers")->insertGetId([
"question_id" => $key,
"option_id" => null,
"responders_id" => $responder_id,
"answer" => $item,
]);
}
}
}
}
DB::commit();
return true;
} catch (\Exception $error) {
DB::rollBack();
return false;
}
}
`
Responder.php isimli model dosyamda tanımladığım event ler;
protected $dispatchesEvents = [
'created' => CreatedResponderEvent::class, // Create işlemi çalışında listener bunu dinliyor olacak
"deleted" => DeletedResponderEvent::class,
"updated" => UpdatedResponderEvent::class,
];
CreatedResponderEvent içeriği;
`
public $responder;
public function __construct(Responder $responder)
{
//
$this->responder = $responder;
}
**CreatedResponderListener içeriği; (Bu event tetiklenince çok fazla yonlendirme oldu hatası alıyorum, ama işlem başarılı şekilde gerçekleşiyor)**
private $surveyContract;
public function __construct(SurveyContract $surveyContract)
{
//
$this->surveyContract = $surveyContract;
}
public function handle(CreatedResponderEvent $event)
{
$this->surveyContract->setSurveyStatusAccordingToResponderCount($event->responder->survey_id);
}
`
stackoverflow da model içinde save methodunu override etmeyle ilgili paylaşımlar gordüm fakat bir türlü olmadı.