📅  最后修改于: 2023-12-03 14:53:21.814000             🧑  作者: Mango
在 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');
最后,我们可以扩展 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 页面的重定向。