Пользовательское исключение Laravel

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

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

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

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

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

$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);
}
}

}

-1

Решение

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

0

Другие решения

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

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

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

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

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

    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

Нет реальной причины выдавать исключение, если ваша цель — показать сообщение этого исключения в представлении, отображаемом контроллером. И это не лучший способ управления исключениями, потому что по умолчанию все исключения, которые являются 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

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

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

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

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

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

$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);
}
}

}
-1

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

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

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

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

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

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

    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);
active «data-shortcut =» A

Нет реальной причины выдавать исключение, если ваша цель — показать сообщение этого исключения в представлении, отображаемом контроллером. И это не лучший способ управления исключениями, потому что по умолчанию все исключения, которые являются 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'));
}
}

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

самый старый «data-shortcut =» O
голосует «data-shortcut =» V
По вопросам рекламы [email protected]