Laravel 5:自定义abort()消息

26

使用Laravel 5,我想发送自定义的abort()消息。
例如,如果用户没有执行某个操作所需的权限,我想要abort(401, "用户无法执行此操作")
目前,当我这样做时,响应文本是HTML页面而不是消息。
如何只返回消息?

注意:我不想传递不同的视图,而只想传递自定义消息。


这个问题在 Laravel 5.5 中已经得到了修复。当您调用 abort($code, $message)(前提是 $request->wantsJson())时,它会自动返回一个包含您的消息的 JSON 格式化错误。 - amphetamachine
9个回答

37
根据 Laravel 5.4 的文档:
可以使用 `abort` 助手函数来返回响应文本:

https://laravel.com/docs/5.4/errors#http-exceptions

abort(500, 'Something went wrong');

使用$exception->getMessage()resources/views/errors/500.blade.php中显示它:

Error message: {{ $exception->getMessage() }}

这是正确的方法,但我如何在此消息中添加“换行”字符或换行符(甚至更好的是项目符号)? - blamb
2
@blamb 如果消息包含HTML代码(如<br>),请使用{!! !!}语法而不是{{}}来显示未转义的内容。 - Kenny
2
在 Laravel 5.7 中,@section('message', __( $exception->getMessage() ? $exception->getMessage() :'Whoops, something went wrong on our servers.')) - ManojKiran A

19

您可以使用abort将响应包装起来,这将停止执行并返回响应。如果您希望它是JSON格式,则添加->json();

# Regular response
abort( response('Unauthorized', 401) );

# JSON response 
abort( response()->json('Unauthorized', 401) );

如果我们使用一个数组消息 abort( response(['message' => 'Unauthorized'], 401) ); 来处理 JSON,代码会更短。 - Christos Lytras

12
答案很简单,只需使用response()辅助方法而不是abort()。语法如下。
return response("User can't perform this action.", 401);

4
然而,return会继续执行调用者的操作。而使用abort,我不想继续进行任何业务逻辑。 - Jānis Elmeris
哦,这个也不行,在我的应用程序中至少是这样的。response('', 400)->json('some message')仍然返回HTML页面。 - Jānis Elmeris

1
您可以在 app/Exceptions/Handler.php 类中处理所有错误异常。
在您的情况下,只需将 render 函数替换为此函数。
public function render($request, Exception $e)
{
   return $e->getMessage();
   //For Json
   //return response()->json(['message' => $e->getMessage()]);
}

1
我尝试了一下,但是在浏览器中它就无法进入 .catch 部分。 - Sharon Haim Pour
我不明白你的意思,“它不会在浏览器中进入.catch”是什么意思。 - vijaykumar
使用 Promise:promise.then(this._thenMethod).catch(this._defaultCatcher); - Sharon Haim Pour
好的。我不确定,但是尝试将响应发送为json格式,像这样返回 response()->json(['message' => $e->getMessage()]); - vijaykumar

1
应该能够在模板中使用以下内容:
{{ $exception->getMessage() }}

0
Handler.php 文件中,我修改了该函数:
 public function render($request, Exception $e)
{
    $response = parent::render($request, $e);

    if (method_exists($e, "getStatusCode")) {
        if ($e->getStatusCode() == 401) {
            $response->setContent($e->getMessage());
        }
    }

    return $response;
}

0

如果你正在编写API而不是使用默认的abort()异常错误,我认为这非常干净:

 abort( response()->json(["message"=>"an error occur"], Response::HTTP_NOT_FOUND) );

无法在Laravel 9中工作 - Alauddin Afif Cassandra
我目前在 Laravel 9 中使用它,它可以正常工作。你能分享一下你尝试时遇到的错误吗? - Slycreator
使用Illuminate\Support\Facades\Response; - Jason

0
api.php 文件中添加以下内容。
 Route::fallback(function () {
  return abort(401,"User can't perform this action.");
 });

-1

首先,在您的头文件或想要显示消息的页面中添加错误消息,例如:

@if($errors->has())
    @foreach ($errors->all() as $error)
        <div>{{ $error }}</div>
    @endforeach
@endif

在控制器中,你可以做这种事情(例如):
public function store(){
    if(user is not permitted to access this action) // check user permission here
    {
        return redirect()->back()->withErrors("User can't perform this actions");
    }
}

您可以通过错误消息进行重定向


我应该补充说明一下,我所说的是关于$.ajax调用而不是浏览器重定向。 - Sharon Haim Pour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接