Laravel 资源集合中的过滤器属性

Fir*_*nis 3 php laravel laravel-5

在新的 Laravel Resource 类中,您可以根据自己的喜好删除属性。

如果要返回很多项,可以使用该函数

Resource::collection()
Run Code Online (Sandbox Code Playgroud)

但这并不能让您在一处添加元数据。输入一个集合,太好了,这是一个很好的格式的许多项目,能够添加元数据。但是,您不能做的是过滤您必须像使用资源一样隐藏属性的集合。我能看到的唯一方法是

foreach ($this->collection as $item) {
        if ($notAdmin) {
            $temp = array_except($item->toArray(), ['secret']);
        }
        $temp['links'] = ['self' => route('restaurant.show', [$item])];
        $data[] = $temp;
    }
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?这似乎是资源集合的一个被忽视的巨大能力

Ken*_*rna 6

基于线程,似乎在使用ResourceCollection类自定义集合(例如BookCollection)时,Laravel 查找 名称相同但没有Collection后缀类的Resource类(在示例中,一个名为 just 的类)。Book

因此,您需要有一个名为: 的资源类:Book您可以在其中自定义要返回到响应的属性和一个名为: 的集合类BookCollection,该类将使用Book- 自定义数据 - 并且还可以让您自定义元数据。

应用程序/Http/Resources/Book.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class Book extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序/Http/Resources/BookCollection.php

<?php

namespace App\Http\Resources\Users;

use Illuminate\Http\Resources\Json\ResourceCollection;

class BookCollection extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->collection;
    }

    public function with($request)    
    {
        return [
            'meta' => [
                'key' => 'value',
            ],
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,如果是这样的话,他们绝对需要在文档中更清楚地说明这一点。我会自己尝试一下,然后将其标记为已接受。 (2认同)