使用Laravel Dependency Injection时如何处理未找到的案例?

时间:2017-11-28 12:35:16

标签: laravel

我正在使用路由/news/{news}和控制器public function show(News $news)。当我提供具有有效ID的路线时,一切正常并且花花公子。但是,如果找不到ID,Laravel将返回404页。我宁愿自己处理这个案子,因为我将它用作API。

我的问题类似于this one,但我想尽可能使用依赖注入。我知道我可以做一个正常的News::where(),但这不是我想解决的问题。因此,问题是;使用Laravel Dependency Injection时如何处理未找到的案例?

我正在构建私有API,因此我想要实现的是在找不到新闻时返回JSON值。

2 个答案:

答案 0 :(得分:2)

如果您想自定义路径模型绑定的分辨率逻辑,那么 venuker的选项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?