Laravel 5 Laravel 5.6-是否将其他参数传递给API资源?

Laravel 5 Laravel 5.6-是否将其他参数传递给API资源?,laravel-5,laravel-5.6,Laravel 5,Laravel 5.6,Laravel可以是单个资源或集合。在某些情况下,需要从控制器向资源/集合传递其他参数。下面是一个简单的示例,演示了如何将User用作单个/集合资源,并将自定义$apple参数传递给资源进行输出的问题。这个问题可以在下面的最终输出(集合)中看到,对于水果值,我们为第一个用户得到了一个不正确的香蕉,而不是正确的苹果值(所有其他用户都得到)。它适用于单个输出,而不是集合。见下文: 具有用户资源的控制器(单个) $user=user::first(); 返回新的用户资源($user,$apple=tr

Laravel可以是单个资源或集合。在某些情况下,需要从控制器向资源/集合传递其他参数。下面是一个简单的示例,演示了如何将
User
用作单个/集合资源,并将自定义
$apple
参数传递给资源进行输出的问题。这个问题可以在下面的最终
输出(集合)
中看到,对于
水果
值,我们为第一个用户得到了一个不正确的
香蕉
,而不是正确的
苹果
值(所有其他用户都得到)。它适用于单个输出,而不是集合。见下文:

具有用户资源的控制器(单个)

$user=user::first();
返回新的用户资源($user,$apple=true);//$苹果参数通过了
具有用户资源的控制器(集合)

$users=User::limit(3)->get();
return UserResource::collection($users,$apple=true);//$苹果参数通过了
用户资源

public function toArray($request)
{
    return [
        'id'            => $this->id,
        'picture'       => $this->picture,
        'first_name'    => $this->first_name,
        'last_name'     => $this->last_name,
        'active'        => $this->active,
        'access_token'  => isset($this->access_token) ? $this->access_token : '', // Additional data
    ];
}

您可以将额外参数作为调用的一部分传递给API端点。然后可以使用UserResource中的$request对象(例如)访问参数

例如,如果使用以下方式从客户端(如web浏览器、axios等)调用端点:

http://localhost:3000/api/users?apple=true
这将使控制器中的参数apple的值为true。无需您执行任何其他操作,也可以在UserResource的toArray($request)中访问它。您可以通过以下类似方式访问它:

public function toArray($request) {
      $isApple = $request->apple;

        return [
            'id'     => (int) $this->id, 
            'name'   => $this->name,
            'fruit'  => $isApple ? 'apple' : 'banana',
        ];
    }

以下方法对我有效:

用户资源

public function toArray($request)
{
    return [
        'id'            => $this->id,
        'picture'       => $this->picture,
        'first_name'    => $this->first_name,
        'last_name'     => $this->last_name,
        'active'        => $this->active,
        'access_token'  => isset($this->access_token) ? $this->access_token : '', // Additional data
    ];
}
class用户资源扩展了资源{
受保护$foo;
公共功能foo($value){
$this->foo=$value;
退还$this;
}
公共功能待命($request){
返回[
'id'=>this->id,
“名称”=>$this->name,
'foo'=>this->foo,
];
}
公共静态函数集合($resource){
返回新的UserResourceCollection($resource);
}
}
UserCollection

类UserResourceCollection扩展了ResourceCollection{ 受保护$foo; 公共功能foo($value){ $this->foo=$value; 退还$this; } 公共功能待命($request){ 返回$this->collection->map(函数(UserResource$resource)use($request){ 返回$resource->foo($this->foo)->toArray($request); })->全部(); //或者使用HigherOrderCollectionProxy //返回$this->collection->each->foo($this->foo)->map->toArray($request)->all() //还是简单 //$this->collection->each->foo($this->foo); //返回父::toArray($request); } }
传递附加参数的不同方式

$user = User::find($user->id);
$user->access_token = $tokenResult->accessToken; // Add additional data
return new ProfileResource($user);
(新用户资源($user))->foo('bar');
(新的UserResourceCollection($user))->foo('bar');
UserResource::make($user)->foo('bar');
UserResourceCollection::make($users)->foo('bar');
UserResource::collection($users)->foo('bar');

为了使用Laravel 5.7,我对

用户资源

public function toArray($request)
{
    return [
        'id'            => $this->id,
        'picture'       => $this->picture,
        'first_name'    => $this->first_name,
        'last_name'     => $this->last_name,
        'active'        => $this->active,
        'access_token'  => isset($this->access_token) ? $this->access_token : '', // Additional data
    ];
}
class用户资源扩展了资源{
受保护$foo;
公共功能foo($value){
$this->foo=$value;
退还$this;
}
公共功能待命($request){
返回[
'id'=>this->id,
“名称”=>$this->name,
'foo'=>this->foo,
];
}
公共静态函数集合($resource){
返回新的UserResourceCollection($resource,get_called_class());
}
}
UserCollection

类UserResourceCollection扩展了AnonymousResourceCollection{ 受保护$foo; 公共功能foo($value){ $this->foo=$value; 退还$this; } 公共功能待命($request){ 返回$this->collection->map(函数(UserResource$resource)use($request){ 返回$resource->foo($this->foo)->toArray($request); })->全部(); } }
在Laravel 5.8中,这个简单的技巧对我很有效:)

控制器

$user = User::find($user->id);
$user->access_token = $tokenResult->accessToken; // Add additional data
return new ProfileResource($user);
资源

public function toArray($request)
{
    return [
        'id'            => $this->id,
        'picture'       => $this->picture,
        'first_name'    => $this->first_name,
        'last_name'     => $this->last_name,
        'active'        => $this->active,
        'access_token'  => isset($this->access_token) ? $this->access_token : '', // Additional data
    ];
}

我解决了我的问题,只需检索

public function toArray($request){ 

   $param = $request->get('param');

   ... 

} 
不要通过资源传递参数。

您可以使用laravel 8

对于存储功能附加

    return (UserResource::make(User::find($user->id)))
            ->additional([
                'message'=>[
                    ['user by name: '.$user->name.' created successfull.']
                ]
            ])->response()->setStatusCode(201);

收集功能代码在哪里?在Laravel代码库中,我认为它需要一个已经熟悉Laravel资源的人(如上链接),他已经面对这个问题并解决了它。这不起作用我尝试了这个
UserResource::collection($users)->foo('bar')但出现错误
方法照亮\Support\Collection::foo不存在。
@MunnaKhan
foo
不是静态方法。您正在使用
foo
作为静态方法。您需要首先实例化
UserResource
集合,如答案所示。集合如何?我有几个数据,这些数据是基于
all()
获取的,然后返回像'DataResource::collection($data');没有了解你的问题,你面临什么问题?