📌  相关文章
📜  如果 laravel 中不存在页面,如何将用户发送到 404 页面 - PHP (1)

📅  最后修改于: 2023-12-03 14:53:21.814000             🧑  作者: Mango

如何在 Laravel 中将用户发送到 404 页面

在 Laravel 中,当用户访问不存在的页面时,我们可以将他们重定向到 404 页面,以提高用户体验和程序的可靠性。下面介绍几种实现方法:

方法一:使用 abort() 函数

Laravel 提供了 abort() 函数,可以很方便地向用户返回指定的 HTTP 状态码和错误信息。我们可以利用这个函数将用户重定向到 404 页面。

首先,创建一个名为 404.blade.php 的视图文件,放在 resources/views/errors 目录下。这个文件将为我们的 404 页面提供界面。它可以包含任何你认为合适的内容,如错误信息、导航链接等。

接下来,在控制器中处理不存在的页面请求时,调用 abort() 函数并指定我们想要返回的 HTTP 状态码。例如:

public function show($id)
{
    $model = Model::find($id);

    if (!$model) {
        abort(404);
    }

    return view('models.show', ['model' => $model]);
}

这个控制器方法会尝试从数据库中获取一个 ID 为 $id 的 model,如果 model 不存在,就会调用 abort(404) 函数并向用户显示 404 页面。

方法二:使用中间件

我们也可以通过中间件将用户重定向到 404 页面。这个方法比起直接在控制器中处理不存在的页面请求要麻烦一些,但是可以让我们更好地管理请求的生命周期。

首先,创建一个名为 RedirectIfNotFound.php 的中间件,放在 app/Http/Middleware 目录下。这个中间件将检查请求的模型是否存在,如果不存在就重定向到 404 页面。

namespace App\Http\Middleware;

use Closure;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class RedirectIfNotFound
{
    public function handle($request, Closure $next, $modelClass)
    {
        $modelName = strtolower(class_basename($modelClass));
        try {
            $modelClass::findOrFail($request->route($modelName));
        } catch (ModelNotFoundException $e) {
            abort(404);
        }

        return $next($request);
    }
}

在这个中间件中,我们定义了一个参数 $modelClass,它将作为查找模型的类名。我们还使用 findOrFail() 方法查找模型,如果找不到就抛出 ModelNotFoundException 异常。

接下来,在 app/Http/Kernel.php 文件中添加中间件到路由组中:

protected $middlewareGroups = [
    'web' => [
        // ...
        \App\Http\Middleware\RedirectIfNotFound::class . ':Model', // 添加中间件到路由组中
    ],

    // ...
];

'web' 是一个中间件组的名称,它包含了我们的应用程序中的所有 Web 路由。在这个数组中,我们使用 :Model 占位符作为中间件的参数。这个占位符会被用实际的模型替换,例如 \App\Http\Middleware\RedirectIfNotFound::class . ':User' 将处理 User 模型的请求。

现在就可以在路由中使用这个中间件了:

Route::get('/models/{model}', 'ModelController@show')->middleware('web');
方法三:使用自定义 Exception

最后,我们可以扩展 Laravel 提供的 Exception 类,自定义一个 NotFoundException 异常。当我们需要将用户重定向到 404 页面时,我们就可以抛出这个异常。

首先,创建一个名为 NotFoundException.php 的异常类,放在 app/Exceptions 目录下。这个异常类将作为我们抛出 404 异常的途径,我们可以在控制器或其他场合使用它。

namespace App\Exceptions;

use Exception;
use Illuminate\Http\Request;

class NotFoundException extends Exception
{
    public function render(Request $request)
    {
        return response()->view('errors.404', [], 404);
    }
}

在这个异常类中,我们重写了 render() 方法。当这个异常被抛出时,Laravel 自动调用这个方法并返回一个 HTTP 响应。在这个方法中,我们使用 view() 函数返回我们的 404.blade.php 视图并指定 HTTP 状态码为 404。

接下来,我们需要告诉 Laravel 使用这个异常类来处理我们的 404 异常。在 app/Exceptions/Handler.php 文件中的 render() 方法中添加以下代码:

public function render($request, Exception $exception)
{
    if ($exception instanceof \App\Exceptions\NotFoundException) {
        return $exception->render($request);
    }

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

在这段代码中,我们检查要渲染的异常是否是我们刚刚创建的 NotFoundException 类型。如果是,就调用 render() 方法返回 HTTP 响应,否则就将控制权交给父类的 render() 方法。

现在我们就可以在控制器中抛出这个异常,将用户重定向到我们的 404 页面:

public function show($id)
{
    $model = Model::find($id);

    if (!$model) {
        throw new NotFoundException('Model not found.');
    }

    return view('models.show', ['model' => $model]);
}

以上是三种实现方法,适用于不同的场合和需求。根据自己的实际情况选择一种最适合自己的方式来处理 404 页面的重定向。