如何从Laravel中的资源控制器中删除show()函数

2 php laravel laravel-5

我的Laravel项目中有资源控制器.

路线

Route::resource('products', 'ProductsController');
Run Code Online (Sandbox Code Playgroud)

在ProductController中,我不想使用show($id)函数,因为在我的项目中不需要这个函数.
当我点击URL属于此控制器时,它会抛出BadController错误.
URL示例:http:// localhost/My-Project/products/123
此URL直接调用show()函数,但我删除了该函数以提高编码标准.但是当任何用户直接点击该URL时,它就会抛出错误.

如果有人直接调用该URL,则应该抛出404页面未找到.

是的,我可以通过重定向或show()函数中的其他操作来处理URL请求,但我不想在我的项目中使用不必要的函数.

有没有办法在没有这个功能的情况下抛出404页面?

Zay*_*Ali 7

放在show里面except.

Route::resource('products', 'ProductsController', [
    'except' => [ 'show' ]
]);
Run Code Online (Sandbox Code Playgroud)

它不会注册products.show路由,因此会抛出异常.

因此,第一个选项是通过将以下代码添加到以下代码来处理异常app/Exceptions/Handler.php:

use \Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttp??Exception;

...
...

public function render($request, Exception $e) 
{
    if ($e instanceof MethodNotAllowedHttpException) {
        abort(404);
    }

    return parent::render($request, $e);
}
Run Code Online (Sandbox Code Playgroud)

然后编辑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\-\/]+)');
Run Code Online (Sandbox Code Playgroud)


Tim*_*len 7

可以为资源控制器提供要注册的操作的子集:

Route::resource('products', 'ProductsController', [
    'only' => ['index', 'create', 'store']
]);
Run Code Online (Sandbox Code Playgroud)

这样,您可以显式设置要注册的路由。

如有疑问,请使用php artisan route:list来查看在您的应用程序中注册了哪些路由。