Пользовательское исключение Laravel - PullRequest
0 голосов
/ 20 сентября 2018

Перед публикацией этого вопроса я искал в Интернете соответствующие ответы, но не получил ни одного. Это мои следующие вопросы:

1) Как вызвать исключение без попытки catch в контроллере laravel и получить исключение в представленииназывается контроллером. Пример: TestController.php

function index(){
throw new CustomException('Data not found');
return view('dashboard');
}

Как получить сообщение об исключении в представлении панели управления

2) Как установить формат для сообщения об исключении, предположим, я хочу вернуть форматas

$response['code'] = 0;
        $response['status'] = 'error';
        $response['message'] = 'message';
        $response['data'] = '';

Я создал собственное исключение, но не знаю, как его использовать для полного использования

<?php

namespace App\Exceptions;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Mockery\Exception;

class CustomException extends Exception{

    public $response;


    /**
     * Report the exception.
     *
     * @return void
     */
    public function report()
    {
    }

    /**
     * Render the exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render($request,$exception){
        ob_clean();
        $response['code'] = 0;
        $response['status'] = 'error';
        $response['message'] = 'Message';
        $response['data'] = '';
        if(!$request->ajax()){
            // non ajax response
        }else{
            return response()->json($response);
        }
    }

}

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Отвечая на ваши вопросы:

  1. Чтобы передать это исключение для просмотра, вы можете реализовать метод render, который вы уже начали делать.Вы можете просто сделать:

    if(!$request->ajax()){
        view('error_handler', compact('exception'))
    } else {
       return response()->json($response);
    }
    

, так что теперь вы можете просто создать error_handler.blade.php представление, и у вас будет доступ к переменной $exception, так что вы можете использовать там {{ $exception->getMessage}} и т. Д.

Вы не определили, чего именно хотите достичь, однако это должно работать без проблем:

public function render($request,$exception) {

    if(!$request->ajax()){
        view('error_handler', compact('exception'))
    }

    return response()->json([
              'code' => $exception->getCode(),
              'status' => 'error',
              'message' => $exception->getMessage(),
              'data' => 'sample data'
          ]);

}

Конечно, вместо использования $exception->getCode() дляcode вы можете поместить все, что захотите, это всего лишь пример того, что вы также можете использовать код и сообщение, которое у вас есть в вашем исключении, при условии, что вы задали какой-то пользовательский при выдаче исключения, например:

throw new CustomException('This is custom message', 123);
0 голосов
/ 21 сентября 2018

Нет реальной причины выдавать исключение, если ваша цель - показать сообщение этого исключения в представлении, отображаемом контроллером.И это не лучший способ управлять исключениями, потому что по умолчанию все исключения, которые являются throw, обрабатываются и перехватываются в классе App\Exceptions\Handler.

Я думаю, вы точно знаете, когда этот тип CustomExption вы создаетебудет сгенерирован, но вместо того, чтобы сгенерировать эту ошибку, просто проследите ту ошибку, которая нуждается в исключении другим способом без исключения.Для этого вы можете создать массив, в котором старый код, статус, сообщение, данные и передать его в метод представления;

class CustomController extends Controller
{
    public function samemethod(){
         // some code that can generate an error

         // construct the error data
         $customErrorData = [
             'code' => 0000,
             'status' => "some status",
             'message' => "Some error message",
             'data' => [...]
         ];

         // After error data creation you can pass it to the view
         return View::make('customview', compact('customErrorData'));
    }
}

У вас есть данные об ошибках в вашем представлении

0 голосов
/ 20 сентября 2018

Все неперехваченные исключения перехватываются обработчиком исключений по умолчанию.Если вы хотите, чтобы это происходило иначе, вам просто нужно изменить его: https://laravel.com/docs/5.7/errors#the-exception-handler

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...