我正在使用路由/news/{news}
和控制器public function show(News $news)
。当我提供具有有效ID的路线时,一切正常并且花花公子。但是,如果找不到ID,Laravel将返回404页。我宁愿自己处理这个案子,因为我将它用作API。
我的问题类似于this one,但我想尽可能使用依赖注入。我知道我可以做一个正常的News::where()
,但这不是我想解决的问题。因此,问题是;使用Laravel Dependency Injection时如何处理未找到的案例?
我正在构建私有API,因此我想要实现的是在找不到新闻时返回JSON值。
答案 0 :(得分:2)
但是对于第四种选择,为什么不尝试中间件呢?假设你有一个
class NewsIsExist
{
public function handle($request, Closure $next) {
$news_id = $request->route('news_id');
$news = News::find($news_id);
if($news) {
$request->merge(['news' => $news]);
return $next($request);
} else {
return response()->json([
'error' => "News not found."
], 404);
}
}
}
调整您的路线以使用中间件
Route::get('news/{news_id}', [
'uses' => "NewsController@show",
'middleware' => 'news-exists'
]);
然后,您可以轻松访问控制器中的新闻实例
use Illuminate\Http\Request;
public function show(Request $request) {
$news = $request->get('news');
}
答案 1 :(得分:1)
因此,在更新您的问题后,现在我们知道,您只想在找不到新闻时返回JSON值。在这种情况下,我会使用路由回退方法,该方法在Laravel捕获404异常时执行。好的是,您只需要实现一次,它将适用于新闻/评论/用户以及您在API中拥有的所有其他内容。将此代码添加到路径文件中:
Route::fallback(function(){
return response()->json(['message' => 'Not Found!'], 404);
});
更多信息 - https://themsaid.com/laravel-55-better-404-response-20170921
=============================================== ============
由于您没有指定您想要做什么,这里有几个选项:
选项1 - 自定义错误页面
https://laravel.com/docs/5.5/errors#custom-http-error-pages
选项2 - 显示默认项
它会将News
类型的另一个对象传递给您的控制器
<?php
namespace App\Providers;
use App\News;
use Illuminate\Support\Facades\Route;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// 'news' comes from your route param name
Route::bind('news', function ($value) {
$news = News::where('id', $value)->first();
if ( ! $news) {
//assuming here the first item is the default one
$news = News::first();
}
return $news;
});
}
}
选项3 - 捕获所有404
您可以捕获所有404错误并返回您想要的任何内容How do I catch exceptions / missing pages in Laravel 5?