Вложенный Laravel Попробуй поймать не бросая внутреннее исключение, только внешнее - PullRequest
0 голосов
/ 14 мая 2019

Я немного запутался с блоками 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никогда не бьют?

1 Ответ

0 голосов
/ 14 мая 2019

Я думаю, вам просто нужно сбросить свое исключение.

        } catch (Exception $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);
            //throw $e
            throw $e;
        }

Вы возвращаете false из этого блока catch, который находится внутри другого блока try / catch.

...