Требуется ли блокировка catch внутри контроллера в laravel? - PullRequest
1 голос
/ 16 февраля 2020

Я сейчас работаю над проектом с моим другом. Он следует этому методу написания кодов. Это хорошо или плохо? У меня тоже не так много опыта разработчика.

public function store(Request $request)
 {  
    try   
    {  
        $comment = new TicketComment();  
        $comment->content = $request['comment'];  
        $comment->user_id = Auth::user()->id;  
        $comment->ticket_id = $request['ticketId'];  
        $comment->save();  
        $ticket = Ticket::where('id', '=', $comment->ticket_id)->first();  
        $ticket->updated_at = $comment->created_at;  
        $ticket->update();  
    }    
    catch(Exception $e)  
    {  
        request()->session()->flash('unsuccessMessage', 'Failed to add comment !!!');  
        return redirect()->back();  
    }  
    request()->session()->flash('successMessage', 'Comment has been successfully added !!!');  
    return redirect()->back();  
}  

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

Всегда хорошо справляться с ошибками. Тем не менее, Laravel имеет встроенную обработку ошибок, что облегчает этот процесс. Это не значит, что вам не нужен блок try catch. Подробнее об обработке ошибок laravel: https://laravel.com/docs/5.8/errors

1 голос
/ 16 февраля 2020

Не имеет широкого блока исключений. Только перехватывайте исключения, которые вы ожидаете выбросить в этот блок, таким образом, вы можете правильно регистрировать непредвиденные исключения и исправлять любые другие ошибки в вашем коде, вместо того, чтобы скрывать их от себя.

Если вы должны сделать это, это может быть в контексте чего-то вроде:

public function store(Request $request)
 {  
    try   
    {  
        $comment = new TicketComment();  
        $comment->content = $request['comment'];  
        $comment->user_id = Auth::user()->id;  
        $comment->ticket_id = $request['ticketId'];  
        $comment->save();  
        $ticket = Ticket::where('id', '=', $comment->ticket_id)->first();  
        $ticket->updated_at = $comment->created_at;  
        $ticket->update();  
    }    
    catch(Exception $e)  
    {  
        if (!($e instanceof SQLException)) {
            app()->make(\App\Exceptions\Handler::class)->report($e); // Report the exception if you don't know what actually caused it
        }
        request()->session()->flash('unsuccessMessage', 'Failed to add comment !!!');  
        return redirect()->back();  

    }  
    request()->session()->flash('successMessage', 'Comment has been successfully added !!!');  
    return redirect()->back();  
}  

Таким образом, о любых непредвиденных исключениях все равно будут сообщаться, и вы сможете go просмотреть свои журналы позже. исправить любые ошибки, которые их вызывают.

В качестве напоминания, начиная с PHP 7.1, вы можете иметь объединение исключений в блоке catch ( Reference ), например,

try { } 
catch (ExceptionType1|ExceptionType2 $e) {

}

Таким образом, вы можете обрабатывать исключения, которые вы знаете, вы можете обработать, и пусть Laravel обрабатывает те, которые вы не знаете, как обрабатывать.

Обратите внимание, что в коде контроллера, как правило, нет необходимости иметь блоки try-catch, вы всегда можете использовать обработчик исключений, чтобы выполнить обратную комбинацию flash / redirect для всех необработанных исключений, если это ваш предпочтительный способ справиться с ними.

...