Laravel에서 API 필드를 동적으로 숨기는 방법

藏色散人
풀어 주다: 2021-03-25 09:02:32
앞으로
2239명이 탐색했습니다.

다음 튜토리얼 칼럼인 laravel에서는 Laravel에서 API 필드를 동적으로 숨기는 방법을 소개합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

Laravel에서 API 필드를 동적으로 숨기는 방법

Laravel에서 API 필드를 동적으로 숨기기

최근 Laravel Brasil 커뮤니티에서 보기보다 더 흥미로운 질문을 보았습니다. 다음과 같이 구현된 UsersResource가 있다고 가정해 보세요. UsersResource 用下面的实现:

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UsersResource extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            &#39;id&#39; => $this->id,
            'name' => $this->name,
            'email' => $this->email
        ];
    }
}
로그인 후 복사

出于某种原因,您可能希望在另一个端点上重新使用该资源类,但隐藏email 字段。这篇文章就是告诉你如何实现这一点的。
如果你不知道  API Resources 是什么,请查看我之前关于这个的文章。

  • First Impression on API Resources
  • API Resources with Nested Relationship

1- 初始化项目

有趣的东西从第3节开始.

composer create-project --prefer-dist laravel/laravel api-fields
cd api-fields
touch database/database.sqlite
로그인 후 복사

编辑.env文件,删除数据库设置并使用 SQLite

DB_CONNECTION=sqlite
로그인 후 복사

继续设置项目

php artisan migrate
php artisan make:resource UsersResource
php artisan make:resource --collection UsersResourceCollection 
php artisan make:controller UsersController
php artisan tinker
factory(App\User::class)->times(20)->create();
quit
로그인 후 복사

2- 路由

确保在 api.php 文件中创建一个路由。

Route::apiResource('/users', 'UsersController');
로그인 후 복사

3- 控制器

控制器代表了期望的目标。在这个例子中,让我们假设在用户列表中,我们只想要所有用户的名字,而在用户显示中,我们只想隐藏电子邮件地址。

<?php
namespace App\Http\Controllers;
use App\Http\Resources\UsersResource;
use App\User;
class UsersController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @param User $user
     * @return \Illuminate\Http\Response
     */
    public function index(User $user)
    {
        return UsersResource::collection($user->paginate())->hide(['id', 'email']);
    }
    /**
     * Display a user.
     *
     * @param User $user
     * @return \Illuminate\Http\Response
     */
    public function show(User $user)
    {
        return UsersResource::make($user)->hide(['id']);
    }
}
로그인 후 복사

为了达到这个目的,我们需要 UsersResourceCollectionUsersResource 同时知道如何处理  hide 调用。

4-  UsersResource 类

让我们从  show 方法开始.  UsersResource::make 将会返回  UsersResource 的对象. 因此,我们应该揭开  hide 的神秘面纱,它可以存储我们期望从响应中移除的键.

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UsersResource extends Resource
{
    /**
     * @var array
     */
    protected $withoutFields = [];
   
     /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->filterFields([
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email
        ]);
    }
    /**
     * Set the keys that are supposed to be filtered out.
     *
     * @param array $fields
     * @return $this
     */
    public function hide(array $fields)
    {
        $this->withoutFields = $fields;
        return $this;
    }
    /**
     * Remove the filtered keys.
     *
     * @param $array
     * @return array
     */
    protected function filterFields($array)
    {
        return collect($array)->forget($this->withoutFields)->toArray();
    }
}
로그인 후 복사

大功告成! 现在我们可以访问 http://api.dev/api/users/1 ,你会发现响应中已经没有id 字段了。

{
 "data": {
  "name": "Mr. Frederik Morar",
  "email": "darryl.wilkinson@example.org"
 }
}
로그인 후 복사

5-  UsersResourceCollection 类

执行项目集合中的 index 方法, 我们需要作出如下修改:

  • (1) 确保  UsersResource::collection 返回 UsersResourceCollection 实例
  • (2)  在  UsersResourceCollection 上公开 hide 方法
  • (3) 将隐藏的字段传递给  UsersResource

关于 (1), 我们只需要重写  UsersResource 中的 collection 方法

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UsersResource extends Resource
{
    public static function collection($resource)
    {
        return tap(new UsersResourceCollection($resource), function ($collection) {
            $collection->collects = __CLASS__;
        });
    }
    
    /**
     * @var array
     */
    protected $withoutFields = [];
    /**
     * Transform the resource into an array.
     * 将资源转换为一个数组
     * 
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->filterFields([
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email
        ]);
    }
    /**
     * Set the keys that are supposed to be filtered out.
     *  设置需要隐藏过滤掉的键
     *  
     * @param array $fields
     * @return $this
     */
    public function hide(array $fields)
    {
        $this->withoutFields = $fields;
        return $this;
    }
    /**
     * Remove the filtered keys.
     * 删除隐藏的键
     * 
     * @param $array
     * @return array
     */
    protected function filterFields($array)
    {
        return collect($array)->forget($this->withoutFields)->toArray();
    }
}
로그인 후 복사

关于 (2) 和 (3) 我们需要修改 UsersResourceCollection 文件. 让我们公开 hide 方法并使用隐藏字段处理集合。.

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UsersResourceCollection extends ResourceCollection
{
    /**
     * @var array
     */
    protected $withoutFields = [];
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->processCollection($request);
    }
    public function hide(array $fields)
    {
        $this->withoutFields = $fields;
        return $this;
    }
    /**
     * Send fields to hide to UsersResource while processing the collection.
     *  将隐藏字段通过 UsersResource 处理集合
     * 
     * @param $request
     * @return array
     */
    protected function processCollection($request)
    {
        return $this->collection->map(function (UsersResource $resource) use ($request) {
            return $resource->hide($this->withoutFields)->toArray($request);
        })->all();
    }
}
로그인 후 복사

就是这么简单! 现在我们访问 http://api.dev/api/users  看到返回结果中没有了 id 和 email 字段了如在 UsersController 中的指定方法 .

{
 "data": [{
  "name": "Mr. Frederik Morar"
 }, {
  "name": "Angel Daniel"
 }, {
  "name": "Brianne Mueller"
 }],
 "links": {
  "first": "http://lab.php71/api-fields-2/public/api/users?page=1",
  "last": "http://lab.php71/api-fields-2/public/api/users?page=7",
  "prev": null,
  "next": "http://lab.php71/api-fields-2/public/api/users?page=2"
 },
 "meta": {
  "current_page": 1,
  "from": 1,
  "last_page": 7,
  "path": "http://api-fields.lab.php71/api/users",
  "per_page": 3,
  "to": 3,
  "total": 20
 }
}
로그인 후 복사

6- 总结

本文目标是让Resource类通过隐藏一些在其他接口允许暴露的字段从而变得更加灵活。例如当我们请求/users接口时响应的数据是不包含avatar字段的,但是当请求/users/99时响应的数据里包含avatarrrreee

어떤 이유로 다른 엔드포인트에서 해당 리소스 클래스를 재사용하고 email 필드를 숨기고 싶을 수도 있습니다. 이 기사에서는 이를 달성하는 방법을 설명합니다.
API 리소스가 무엇인지 모르신다면 이에 대한 이전 기사를 확인해 보세요.

  • API 리소스에 대한 첫인상
  • 중첩 관계가 있는 API 리소스

1- 초기화 프로젝트

흥미로운 내용 시작 섹션 3.
rrreee
.env 파일을 편집하고 데이터베이스 설정을 삭제한 다음 SQLite 컨트롤러는 원하는 목표를 나타냅니다. 이 예에서는 사용자 목록에는 모든 사용자의 이름만 필요하고 사용자 표시에는 이메일 주소만 숨기고 싶다고 가정해 보겠습니다.
rrreee🎜이를 달성하려면 UsersResourceCollectionUsersResourcehide 호출을 처리하는 방법도 알아야 합니다. 🎜

4- UsersResource 클래스

🎜 show 메서드부터 시작하겠습니다. UsersResource::makeUsersResource 개체를 반환합니다. 따라서 응답에서 제거하려는 키를 저장하는 hide를 이해해야 합니다. 이제 http://api .dev/api/users/1에 액세스할 수 있습니다. , 응답에 id 필드가 없다는 것을 알 수 있습니다. 🎜rrreee

5- UsersResourceCollection 클래스

🎜프로젝트 컬렉션에서 index 메서드를 실행하려면 다음과 같이 수정해야 합니다.🎜
  • (1) UsersResource ::collection UsersResourceCollection 인스턴스를 반환합니다.
  • (2) UsersResourceCollectionhide 메서드를 노출합니다.
  • (3) 숨겨진 필드를 UsersResource에 전달
🎜(1)에 대해 다음에서 UsersResource만 다시 작성하면 됩니다. collection 메서드 🎜rrreee🎜 (2)와 (3)과 관련하여 UsersResourceCollection 파일을 수정해야 합니다. hide 메서드를 노출하고 Hidden을 사용하겠습니다. 현장 처리가 수집됩니다. .🎜rrreee🎜정말 간단합니다! 이제 http://api.dev/api/users를 방문하면 idemail 필드는 <code>UsersController에 지정된 것과 같습니다.🎜rrreee

6- 요약

🎜이 문서의 목표는 리소스 클래스는 기타 인터페이스 중 일부를 숨기므로 노출된 필드를 허용하므로 더욱 유연해집니다. 예를 들어 /users 인터페이스를 요청하면 응답 데이터에 avatar 필드가 포함되지 않지만 /users/99를 요청하면 > 인터페이스, 응답 데이터에는 avatar 필드가 포함되어 있습니다. 🎜🎜API 리소스에 대한 지나치게 반복적인 요청은 단순한 일을 더 복잡하게 만들 수 있으므로 권장하지 않습니다. 따라서 요청할 때 특정 특정 필드를 숨기는 것이 더 간단하고 합리적인 해결책입니다. 🎜🎜🎜🎜🎜추천: 🎜최신 5개 Laravel 비디오 튜토리얼🎜🎜🎜🎜

위 내용은 Laravel에서 API 필드를 동적으로 숨기는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿