【问题标题】:How do I handle a not found case when using Laravel Dependency Injection?使用 Laravel 依赖注入时如何处理未找到的情况?
【发布时间】:2017-11-29 17:28:03
【问题描述】:

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

我的问题类似于this one,但如果可能的话,我想使用依赖注入。我知道我可以做一个普通的News::where(),但这不是我想要解决这个问题的方式。因此,问题是;使用 Laravel 依赖注入时如何处理未找到的情况?

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

【问题讨论】:

  • 没有这种绑定,更紧你

标签: laravel


【解决方案1】:

如果您想自定义路由模型绑定的解析逻辑,veNuker 的选项 2 是一种选择。

但是对于第 4 种选择,为什么不试试中间件呢?假设你有一个

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'
]);

然后您可以轻松地在控制器中访问您的 News 实例

use Illuminate\Http\Request;

public function show(Request $request) {
    $news = $request->get('news');
}

【讨论】:

    【解决方案2】:

    新答案

    所以在更新您的问题后,现在我们知道,您只想在未找到新闻时返回 JSON 值。在这种情况下,我会使用路由回退方法,该方法在 Laravel 捕获 404 异常时执行。好消息是,您只需要实现一次,它将适用于 news/cmets/users 以及您的 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?

    【讨论】:

    • 你说得对,我没有具体说明我真正想要实现的目标。我现在已经更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2017-04-10
    • 2011-05-27
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多