请问 DingoApi 的 Transformer 怎么返回自定义状态码?比如我要在 Transformer 中添加一个 status_code

请问DingoApi的Transformer怎么返回自定义状态码,比如我要在Transformer中添加一个status_code

zhangatle
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

同问,请问解决了么?

5年前 评论

很简单

<?php

namespace App\Transformers;

use App\Models\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{
    public $status;

    public function __construct($code)
    {
        $this->status = $code;
    }

    public function transform(User $user)
    {
        return [
            'id' => $user->id,
            'name' => $user->name,
            'email' => $user->email,
            'avatar' => $user->avatar,
            'introduction' => $user->introduction,
            'bound_phone' => $user->phone ? true : false,
            'bound_wechat' => ($user->weixin_unionid || $user->weixin_openid) ? true : false,
            'last_actived_at' => $user->last_actived_at->toDateTimeString(),
            'created_at' => $user->created_at->toDateTimeString(),
            'updated_at' => $user->updated_at->toDateTimeString(),
            'status_code' => $this->status
        ];
    }
}

在方法中调用的时候

 return $this->response->item($this->user(),new UserTransformer(201));

输出

{
    "data": {
        "id": 1,
        "name": "Summer",
        "email": "summer@yousails.com",
        "avatar": "https://fsdhubcdn.phphub.org/uploads/images/201710/14/1/ZqM7iaP4CR.png?imageView2/1/w/200/h/200",
        "introduction": "Mollitia earum vel possimus accusantium nesciunt error ut.",
        "bound_phone": false,
        "bound_wechat": false,
        "last_actived_at": "2018-11-27 14:22:22",
        "created_at": "2018-11-27 14:22:22",
        "updated_at": "2018-11-27 14:22:22",
        "status_code": 201
    }
}
5年前 评论

@AmberLavigne 这样数据不就失去状态判断的意义了?

5年前 评论

@xulei 没有理解上去你说的话。 本人是 不推荐往transform 里面放状态码的,因为 transform 只是用来显示和转换数据的,状态码已经在http中有了,不必多此一举。

5年前 评论
  • 可以通过 setMeta 来实现
return $this->response->item($this->user(),new UserTransformer)->setMeta(['status_code' => 200]);
  • 你还可以配合自定义 serializer 来调整响应结构

新建 app/Serializers/DataSerializer.php 文件

<?php

namespace App\Serializers;

use League\Fractal\Serializer\ArraySerializer;
use League\Fractal\Pagination\PaginatorInterface;

class DataSerializer extends ArraySerializer
{

    public function collection($resourceKey, array $data)
    {
        return compact('data');
    }

    public function item($resourceKey, array $data)
    {
        return compact('data');
    }

    public function meta(array $meta)
    {
        return $meta;
    }

    public function paginator(PaginatorInterface $paginator)
    {
        $pagination = [
            'total' => (int)$paginator->getTotal(),
            'current' => (int)$paginator->getCurrentPage(),
            'pageSize' => (int)$paginator->getPerPage(),
        ];

        return compact('pagination');
    }

    public function mergeIncludes($transformedData, $includedData)
    {
        if (!$this->sideloadIncludes()) {
            foreach ($includedData as $identifier => $data) {
                $key = snake_case($identifier);
                $includedData[$key] = current($data);
                if ($key != $identifier) {
                    unset($includedData[$identifier]);
                }
            }
            $transformedData = array_merge($transformedData, $includedData);
        }
        return $transformedData;
    }

}

然后编辑 app/Providers/AppServiceProvider.php 文件

...
public function boot()
{
    $this->app->make(\Dingo\Api\Transformer\Factory::class)
        ->setAdapter(function () {
            return new \Dingo\Api\Transformer\Adapter\Fractal((new \League\Fractal\Manager)->setSerializer(new \App\Serializers\DataSerializer));
        });
}
  • 如果你是想将http状态码转换为 status_code 响应,那么你可以通过中间件来实现
public function handle(Request $request, Closure $next)
{
    try {
        $response = $next($request);
        if ($response instanceof \Illuminate\Http\Response) {
            if ($response->exception instanceof \Exception) {
                throw $response->exception;
            }

            $content = $response->getOriginalContent();

            if (is_array($content)) {
                if (!array_has($content, 'status_code')) {
                    $content['status_code'] = $response->getStatusCode() * 100;
                }
                if (!array_has($content, 'message')) {
                    $content['message'] = '成功!';
                }
                $response->setContent($content);
            }
        }
        return $response;
    } catch (\Exception $exception) {
        $code = ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface) ? $exception->getStatusCode() : 500;
        return new \Illuminate\Http\JsonResponse([
            'data' => [
                'message' => $exception->getMessage(),
            ],
            'message' => $exception->getMessage(),
            'status_code' => (int)($code * 100),
        ]);
    }

}
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!