php Laravel 5:如何使用findOrFail()方法?

lawou6xi  于 2023-01-29  发布在  PHP
关注(0)|答案(4)|浏览(229)

我只是按照一些教程,到目前为止我所做的是:
我的App/Exceptions/Handler.php

<?php
...
use Illuminate\Database\Eloquent\ModelNotFoundException;
...
public function render($request, Exception $e)
{
    if ($e instanceof ModelNotFoundException){
        abort(404);
    }
        return parent::render($request, $e);
}

我的UsersController是这样的:

...
public function edit($id)
{
    $data = User::findOrFail($id);
    $roles = Role::where('title', '!=', 'Super Admin')->get();
    return View('admin.user.edit', compact(['data', 'roles']));
}
...

使用上面的代码,如果我访问http://my.url/users/10/edit,我会得到NotFoundHttpException in Application.php line 901:,是的,因为我的记录中没有id 10,但是使用User::find($id);,我会得到没有数据的正常视图,因为我的记录中没有id 10。
我想要的是显示默认404,然后重定向到某处或返回的东西,如果记录没有找到与User::findOrFail($id);?我怎么能做到这一点?
谢谢,任何帮助都感激不尽。
ps: .env APP_DEBUG = true

zfciruhq

zfciruhq1#

这就是你要的,没有例外

public function edit($id)
{
    $data = User::find($id);
    if ($data == null) {
        // User not found, show 404 or whatever you want to do
        // example:
        return View('admin.user.notFound', [], 404);
    } else {
        $roles = Role::where('title', '!=', 'Super Admin')->get();
        return View('admin.user.edit', compact(['data', 'roles']));
    }
}

您的异常处理程序不是必需的。关于Illuminate\Database\Eloquent\ModelNotFoundException
如果未捕获异常,则会自动向用户发送回404 HTTP响应,因此在使用[findOrFail()]时,无需编写显式检查来返回404响应。
另外,我非常确定您现在得到的是异常页面而不是404,因为您处于调试模式。

p8h8hvxi

p8h8hvxi2#

public function singleUser($id)
{
    try {
        $user= User::FindOrFail($id);
        return response()->json(['user'=>user], 200);
    } catch (\Exception $e) {
        return response()->json(['message'=>'user not found!'], 404);
    }
}
k3fezbri

k3fezbri3#

**findOrFail()类似于find()**函数,但具有一个额外的功能-抛出未找到异常

有时你可能希望在没有找到模型时抛出异常,这在路由器或控制器中特别有用,findOrFail和firstOrFail方法将检索查询的第一个结果;但是,如果没有找到任何结果,则将抛出Illuminate\Database\Eloquent\ModelNotFoundException

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

如果未捕获异常,则会自动向用户发送回404 HTTP响应。使用以下方法时,无需编写显式检查即可返回404响应:

Route::get('/api/flights/{id}', function ($id) {
    return App\Flight::findOrFail($id);
});

不推荐这样做,但是如果你仍然想全局处理这个异常,下面是根据你的handle.php所做的修改

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {

        //redirect to errors.custom view page 
        return response()->view('errors.custom', [], 404);
    }

    return parent::render($request, $exception);
}
yr9zkbsy

yr9zkbsy4#

上述主题的后期添加:如果您想处理API后端的异常,而不想检查每个方法中的空结果,并像这样单独返回400 Bad request错误...

public function open($ingredient_id){
    $ingredient = Ingredient::find($ingredient_id);
    if(!$ingredient){
        return response()->json(['error' => 1, 'message' => 'Unable to find Ingredient with ID '. $ingredient_id], 400);
    }
    return $ingredient;
}

而是使用findOrFail并捕获app/Exceptions/Handler.php中的异常。

public function render($request, Exception $exception)
{
    if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
        return response()->json(['error'=>1,'message'=> 'ModelNotFoundException handled for API' ], 400);
    }
    return parent::render($request, $exception);
}

这将在您的控制器中显示如下:

public function open($ingredient_id){
    return Ingredient::findOrFail($ingredient_id);
}

这要干净得多。考虑到你有很多模型和控制器。

相关问题