我的Laravel项目中的资源控制器。
路线
Route::resource('products', 'ProductsController');
在ProductController中,我不想使用show($id)
函数,因为我的项目中不需要这个函数。
当我点击URL属于这个控制器时,它会抛出BadController错误。
网址示例:http://localhost/My-Project/products/123
此URL直接调用show()函数,但我已删除该函数以提高编码标准。但是当任何用户直接点击该URL时,它就会抛出错误。
如果有人直接调用该URL,则应该抛出404页面。
是的,我可以通过重定向或show()函数中的其他操作来处理URL请求,但我不想在项目中使用不必要的函数。
有没有办法在没有这个功能的情况下抛出404页面?
答案 0 :(得分:6)
将show
放入except
。
Route::resource('products', 'ProductsController', [
'except' => [ 'show' ]
]);
它不会注册products.show
路由,因此会抛出异常。
因此,第一个选项是通过将以下代码添加到app/Exceptions/Handler.php
来处理异常:
use \Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
...
...
public function render($request, Exception $e)
{
if ($e instanceof MethodNotAllowedHttpException) {
abort(404);
}
return parent::render($request, $e);
}
然后修改resource/views/erros/404.blade.php
以个性化页面。
或者第二个选项是在路径文件的末尾定义一个完整的路径捕获,以显示404到未定义的路由。
// Catch all undefined routes (place at the very bottom)
Route::get('{slug}', function() {
return view('errors.404');
})->where('slug', '([A-Za-z0-9\-\/]+)');
答案 1 :(得分:4)
可以为资源控制器提供要注册的操作子集:
Route::resource('products', 'ProductsController', [
'only' => ['index', 'create', 'store']
]);
这样,您可以明确设置注册的路由。
如有疑问,请使用php artisan route:list
查看您的申请中注册了哪些路线。