备忘:Dingo 是如何使用 Fractal来转换的?
- 在\App\Http\Controllers\Api\UsersController::me中,如下代码与fractal官方文档代码是不同的,完全看不出有用到Fractal。
return $this->response->item($this->user(), new UserTransformer());
- 原因是:Fractal is the default transformation layer used by the Dingo package
- 查看配置文件可以看出
- config/api.php
'transformer' => env('API_TRANSFORMER', Dingo\Api\Transformer\Adapter\Fractal::class),
- config/api.php
- 注册serviceProvider也可以看出
- \Dingo\Api\Provider\DingoServiceProvider::registerTransformer
//Register the transformer factory. protected function registerTransformer() { $this->app->singleton('api.transformer', function ($app) { return new TransformerFactory($app, $this->config('transformer')); }); }
- \Dingo\Api\Provider\DingoServiceProvider::registerTransformer
- 而 new TransformerFactory 就设置了 adapter
//Create a new transformer factory instance. public function __construct(Container $container, Adapter $adapter) { $this->container = $container; $this->adapter = $adapter; }
- 这个adapter会在下面用到,trace如下:
Dingo\Api\Transformer\Adapter\Fractal->createResource() Dingo\Api\Transformer\Adapter\Fractal->transform() Dingo\Api\Transformer\Factory->transform() Dingo\Api\Http\Response->morph()
-
在\Dingo\Api\Transformer\Adapter\Fractal::createResource可以看到
new FractalItem($response, $transformer, $key)
,这个就和 fractal官方文档代码 吻合了。//Create a Fractal resource instance. protected function createResource($response, $transformer, array $parameters) { $key = isset($parameters['key']) ? $parameters['key'] : null; if ($response instanceof IlluminatePaginator || $response instanceof IlluminateCollection) { return new FractalCollection($response, $transformer, $key); } return new FractalItem($response, $transformer, $key); }
- 在\Dingo\Api\Transformer\Adapter\Fractal::transform可以看到
$this->fractal->createData($resource, $identifier)->toArray()
,与fractal官方文档代码 也吻合了。