Laravel 5.5:如何从控制器向Resource传递参数?
解决Laravel控制器向Resource传递参数的问题
嘿,这个需求其实有几种简单直接的实现方式,我给你逐个说明:
方法一:通过Resource构造函数传递参数
你可以在实例化LocationResource的时候,把$id作为第二个参数传进去,然后在Resource类里定义对应的属性来接收它:
控制器代码修改:
public function getLocation($id){ $result = // 你的查询逻辑 return new LocationResource($result, $id); }
LocationResource类修改:
use Illuminate\Http\Resources\Json\JsonResource; class LocationResource extends JsonResource { private $requestedId; // 重写构造函数,接收额外的$id参数 public function __construct($resource, $requestedId) { parent::__construct($resource); $this->requestedId = $requestedId; } public function toArray($request) { return [ // 你的原有资源字段 'id' => $this->id, 'name' => $this->name, // 这里就可以使用传递过来的$id了 'original_request_id' => $this->requestedId, ]; } }
方法二:使用Resource的additional方法附加参数
如果你不想修改Resource的构造函数,可以用Laravel提供的additional方法,在返回Resource的时候直接附加额外参数,这些参数会被添加到最终的响应JSON中:
控制器代码修改:
public function getLocation($id){ $result = // 你的查询逻辑 return (new LocationResource($result))->additional([ 'requested_id' => $id ]); }
这样返回的响应会包含Resource本身的字段,再加上requested_id这个额外字段,值就是你传入的$id。
方法三:直接从请求对象获取路由参数
其实还有更省事的方式——如果$id是路由里的参数,你可以在Resource的toArray方法里,直接通过$request对象拿到这个参数,完全不需要在控制器手动传递:
LocationResource类修改:
public function toArray($request) { return [ // 你的原有资源字段 'id' => $this->id, 'name' => $this->name, // 直接从路由参数中获取$id 'requested_id' => $request->route('id'), ]; }
这种方法适合你只是需要在Resource中使用路由参数的场景,代码更简洁。
内容的提问来源于stack exchange,提问作者Jonio
相关产品推荐
相关产品推荐

