PHPはLaravelでAPIフィールドを動的に非表示にする

8466 ワード


私は最近Laravel Brasilコミュニティで問題を見て、結果は見た目よりもっと面白いです.UsersResourceの次の実装を想像してみてください.
 $this->id,
            'name' => $this->name,
            'email' => $this->email
        ];
    }
}

何らかの理由で、別のエンドポイントでリソースクラスを再使用したい場合がありますが、emailフィールドは非表示です.この文章はあなたにこの点を実現する方法を教えてくれたのです.もしあなたがAPI Resourcesが何なのか分からないなら、私の前のこの文章を見てください.大型プロジェクト実戦生放送加入(クリック→)私の生放送群677079770
  • 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-コントローラ
    コントローラは、所望のターゲットを表します.この例では、ユーザーリストでは、すべてのユーザーの名前だけが欲しく、ユーザー表示では電子メールアドレスだけを非表示にしたいと仮定します.
    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']);
        }
    }
    

    この目的を達成するためには、UsersResourceCollectionおよびUsersResourceが、hide呼び出しをどのように処理するかを同時に知る必要がある.
    4-UsersResourceクラスshowの方法から始めましょう.UsersResource::makeは、UsersResourceのオブジェクトを返す.したがって、hideの神秘的なベールを解くべきであり、応答から除去することを望むキーを格納することができる.
    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": "[email protected]"
     }
    }
    

    5-UsersResourceCollectionクラス
    プロジェクトセットのindexメソッドを実行するには、次のような変更が必要です.
  • (1)UsersResource::collectionUsersResourceCollectionのインスタンス
  • を返すことを保証する.
  • (2)UsersResourceCollectionhideの方法
  • が開示.
  • (3)非表示のフィールドをUsersResource
  • に渡す.
    (1)については、UsersResourcecollectionメソッドを書き換えるだけです.
    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の方法を開示し、非表示フィールドを使用してセットを処理する.
    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にアクセスすると、idemailのフィールドが、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を要求したときの応答データにはavatarフィールドが含まれている.
    APIリソースを過度に繰り返し要求することはお勧めしません.簡単なことをより複雑にする可能性が高いので、要求時に特定のフィールドを隠すのは、より簡単で合理的な解決策です.
     
    phperは進級する時いつもいくつかの問題とボトルネックに出会って、業務コードは書きすぎて方向感がなくて、そこから昇格するべきだと知らないで、これに対して私はいくつかの資料を整理して、分布式のアーキテクチャ、高拡張性、高性能、高同時性、サービス器の性能の調整、TP 6、laravel、YII 2、Redis、Swoole、Swift、Kafka、Mysqlの最適化、shellスクリプト、Docker、マイクロサービス、Nginxなど複数の知識ポイント高級レベルアップ干物に必要なものを無料で共有できます(クリック→)私の公式グループ677079770