【问题标题】:Generate json with laravel blade使用 laravel 刀片生成 json
【发布时间】:2020-04-26 11:12:58
【问题描述】:

我正在尝试使用 laravel Blade 模板生成 JSON

$articles 是一个集合,当我这样做时

控制器:

return view('eblogger::content.blog.json.home')->withArticles($articles[0]->toArray());

查看:

{
    'data': [
        {
            'id': {{ $articles['id'] }},
            'name': "{{ $articles['name'] }}"
        }
    ]
}

我在 chrome devtools 中得到了这个对象:

没关系,它返回一个对象。

但是当我使用刀片功能时

控制器:

return view('eblogger::content.blog.json.home')->withArticles($articles->toArray());

查看(使用更具体的示例进行编辑)

{
    'data': [
        @foreach($articles['data'] as $article)
           @can('read_this_article', $article)
           {
            'id': {{ $article['id'] }},
            'name': "{{ $article['name'] }}",
            'localization' : "{{getLocalization($article['address'])}}"
           }
           @endcan
        @endforeach
    ]
}

它返回一个像字符串一样的非对象

有没有办法使用 laravel Blade 模板生成 Json ?

编辑

我知道有一个 json 助手可以从对象生成 Json。但我需要的是一种创建自定义 json 的方法。我需要在发送响应之前检查授权和其他处理。

结论

我设法设置了这一代。问题很简单。我忘了在对象后面加逗号。我很清楚这是对正确使用刀片的一种转移。

@mdexp 给我这个链接:https://laravel.com/docs/6.x/eloquent-resources

确实,这是构建 API 的正确方法

在构建 API 时,您可能需要一个转换层,该层位于 在您的 Eloquent 模型和实际的 JSON 响应之间 返回给您的应用程序的用户。 Laravel 的资源类允许 您可以富有表现力和轻松地转换您的模型和模型 集合成 JSON。

谢谢

【问题讨论】:

  • 为什么不直接使用内置的序列化器?
  • 它不仅仅是序列化一个对象。我想创建一个自定义响应
  • 但是您要求的输出可以通过多种方式在 Laravel 中实现。你的方式似乎不是最佳的,你的有什么特别之处?
  • 我想检查一些授权,隐藏一些列,最终在发送响应之前进行一些处理。如果我使用刀片似乎更容易,我不知道如何制作不同的
  • 它不是,如果你指定你想要的例子,我会写一个答案。问题是你很容易生成无效的json。

标签: php laravel


【解决方案1】:

看看这个: https://laravel.com/docs/6.x/responses#json-responses

您无需创建 Blade View 并自定义构建 JSON,使用 Laravel 提供的。

return response()->json($data);

【讨论】:

  • 要生成我的 JSON,我需要使用 blate 模板的一些功能(can、foreach、if ...),所以 json 助手对我不利
  • 这没有意义。您正在使用这些语言结构(foreach 等)来输出您之前构建的数据结构。示例:如果您想将数组输出到 JSON,您不必为此构建 Blade 视图,只需使用响应生成器,它将返回完整的数组结构。试试看!
  • 没关系,现在我使用 eloquent API 资源,这正是我要找的。​​span>
【解决方案2】:

在您的控制器中,只需将 $articles 集合传递给视图:

return view('eblogger::content.blog.json.home')->withArticles($articles);

然后在视图中,您可以在任何需要输出 json 有效负载的地方简单地使用以下代码:

{
    'data': [
        {{ $articles->toJson() }}
    ]
}

此外,如果您只需要打印文章的某些字段,您可以这样做:

{
    'data': [
        {{ $articles->map->only('id', 'title', 'more-attributes...')->toJson() }}
    ]
}

否则,正如@Alexander 所说,创建视图只是为了构建 JSON 并不是实现此目的的正确方法。

【讨论】:

  • 但我想生成自定义 JSON。我不想只是序列化我的对象。我想检查授权,隐藏一些列...
  • 您在构建 API 吗?如果是这样,那么您的方法是错误的,您正在寻找的是API resources
猜你喜欢
  • 2018-05-21
  • 2021-12-12
  • 2017-01-05
  • 2015-02-22
  • 2019-01-31
  • 1970-01-01
  • 2015-08-10
  • 2017-03-15
  • 2021-01-13
相关资源
最近更新 更多