Я немного запутался с блоками Try Catch, до сих пор я просто помещал в них код и пытался отловить ошибку.Сейчас я использую их в Laravel, но, похоже, не могу получить исключение для корректного срабатывания при вложении утверждений, и мне просто интересно, может ли кто-нибудь объяснить, почему или указать мне правильное направление!
У меня есть3 модели, чехлы , члены и документы .
Вот чего я хочу достичь
Попробуйтехранить дела, участников и любые документы загружать (в том числе перемещение документов в папку хранения).Если любой не удастся, отмените все.
Я запускаю хранилище дел и членов внутри функции DB::transaction
, которая работает отлично, но затем я хочу запустить перемещение своего документа/ сохранить в модели документа внешне.
Когда я сохраняю свою форму, сначала запускается функция case store
.
Вот мои модели / контроллеры до сих пор
Case Controller
public function store(AddCaseRequest $request)
{
//Try to create a new case
try{
//New Case
$case = new Cases;
//New Member
$member = new Members;
DB::transaction(function() use ($case, $member) {
//Save Case
$case->fill(request()->all())->save();
//Save Member
$member->fill(request()->all())->save();
//Documents
if(request()->has('document')){
//Loop the documents and store
foreach(request()->document as $doc){
$document = with(new Documents)->storeNewDocument($doc, $case->id, 'case', 'cases');
}
}
}, 3);
//Redirect back to view page
return redirect()->route('cases.view', [$case->id]);
}
//Catch the error
catch(\Exception $e){
//Log the error
Log::debug('Cases Create Error', (Array) $e->getMessage());
//Redirect back
return redirect()->back() //Redirect back
->withErrors(['Whoops! Something went wrong, please try again.']) //Send an error message
->withInput(request()->all()); //Send the inputs back
}
}
Модель документа
public function storeNewDocument($file, $id, $type, $directory)
{
//Check the directory exists
if($this->checkDirectory($directory)){
//Get the file extention
$extension = $file->getClientOriginalExtension();
//Generate a new filename
$newName = md5(uniqid(rand(), true)) . "." . $extension;
//Move the file
try {
//Try to move the file
Storage::disk('local')->putFileAs($directory, $file, $newName);
//Create the new record
$document = new $this;
$document->type = $type;
$document->foreign_id = $id;
$document->nice_name = $file->getClientOriginalName();
$document->name = $nwName;
$document->save();
} catch (Exception $e){
dd($e);
//Log the error
Log::debug('Document Move Error', (Array) $e->getMessage());
//Try to delete the file incase the document save failed
Storage::delete($directory . '/' . $newName);
//Return false
return false;
}
//All moved, return the new name
//return $newName;
}
}
Я подделал ошибку в функции Document storeNewDocument
, пытаясьпри сохранении документа вызывать $nwName
вместо $newName
, чтобы вызвать ошибку.
В настоящее время происходит
Регистр и элемент не создаются (я считаю, что это правильно.потому что где-то выдается ошибка, поэтому транзакция не завершается?)
Файл успешно перемещается в функции Document storeNewDocument
и попадает в папку storage/cases
, что является правильным.
Затем документ не удается сохранить, но dd($e)
inside поймать модель документа не удалось?
На этом этапе записи БД документа, дела и члена не сохранены, но ловушка вообще не срабатывает в модели документа, поэтому я не могу найтифайл и удалить его?
Я действительно не уверен, как работают вложенные операторы try / catch.Может кто-нибудь, пожалуйста, дайте мне знать, почему уловка на моей Document
модели не стреляет, или если я пытаюсь достичь своей цели совершенно глупо?!
Любые разъяснения будут высоко оценены!
Примечание - Функция $this->checkDirectory()
просто проверяет, существует ли функция, и создает ее, если ее нет, с этой функцией проблем нет, просто не вижу смысладобавляя его к вопросу.
update - Ошибка возникает, когда возникает ошибка в функциях модели документа, она всегда срабатывает в функции Case store
первый.Например, если я избавился от функции dd($e)
в catch, в моем файле журнала сообщение журнала не Document Move Error
, это всегда Cases Create Error
, что мне говорит, что документ storeNewDocument
catchникогда не бьют?