Laravel 5.6 - Pass additional parameters to API Resource?

前端 未结 6 978
天涯浪人
天涯浪人 2020-12-28 17:26

A Laravel API Resource can be either a single resource or a collection. In some cases, additional parameters are required to be passed to the resource/collection from the co

6条回答
  •  一整个雨季
    2020-12-28 18:06

    The following approach worked for me:

    UserResource

    class UserResource extends Resource{
    
        protected $foo;
    
        public function foo($value){
            $this->foo = $value;
            return $this;
        }
    
        public function toArray($request){
            return [
                'id' => $this->id,
                'name' => $this->name,
                'foo' => $this->foo,
             ];
        }
    
        public static function collection($resource){
            return new UserResourceCollection($resource);
        }
    }
    

    UserCollection

    class UserResourceCollection extends ResourceCollection{
    
        protected $foo;
    
        public function foo($value){
            $this->foo = $value;
            return $this;
        }
    
        public function toArray($request){
            return $this->collection->map(function(UserResource $resource) use($request){
                return $resource->foo($this->foo)->toArray($request);
        })->all();
    
            // or use HigherOrderCollectionProxy
            // return $this->collection->each->foo($this->foo)->map->toArray($request)->all()
    
            // or simple
            // $this->collection->each->foo($this->foo);
            // return parent::toArray($request);
        }
    }
    

    Different ways to pass the additional parameter

    (new UserResource($user))->foo('bar');
    (new UserResourceCollection($user))->foo('bar');
    
    UserResource::make($user)->foo('bar');
    UserResourceCollection::make($users)->foo('bar');
    UserResource::collection($users)->foo('bar');
    

提交回复
热议问题