Lumen 中 dingo 设置 CustomSerializer

版本

"require": {
        "php": ">=7.0.0",
        "fideloper/proxy": "~3.3",
        "laravel/framework": "5.5.*",
        "laravel/tinker": "~1.0",
        "dingo/api": "2.0.0-alpha1"
    },

Lumen 5.5 设置

避免下面这种写法

$this->response->item(Auth::user(),new UserTransformer(),[],function($resource, $fractal){
    $fractal->setSerializer(new CustomSerializer());
});

可以在AppServiceProvider中添加下面一行代码

app('api.transformer')->getAdapter()->getFractal()->setSerializer(new CustomSerializer());

变成这种写法

$this->response->item(Auth::user(),new UserTransformer());

注册服务的顺序

$app->register(Dingo\Api\Provider\LumenServiceProvider::class);
$app->register(App\Providers\AppServiceProvider::class);

Laravel 5.5 设置

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class DingoServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->app['Dingo\Api\Transformer\Factory']->setAdapter(function ($app) {
            $fractal = new \League\Fractal\Manager;
            $fractal->setSerializer(new \App\Serializers\DataArraySerializer);
            return new \Dingo\Api\Transformer\Adapter\Fractal($fractal);
        });
    }

    public function register()
    {

    }
}
<?php

namespace App\Serializers;
use League\Fractal\Serializer\ArraySerializer;

class DataArraySerializer extends ArraySerializer
{

    /**
     * Serialize a collection.
     *
     * @param string $resourceKey
     * @param array $data
     *
     * @return array
     */
    public function collection($resourceKey, array $data)
    {
        $resultData = ['data' => $data, 'status_code' => 200, 'message' => 'success'];
        if (!empty($resourceKey)) {
            $resultData['total'] = $resourceKey;
        }
        return $resultData;
    }

    /**
     * Serialize an item.
     *
     * @param string $resourceKey
     * @param array $data
     *
     * @return array
     */
    public function item($resourceKey, array $data)
    {
        return ['data' => $data, 'status_code' => 200, 'message' => 'success'];
    }

    /**
     * Serialize null resource.
     *
     * @return array
     */
    public function null()
    {
        return ['data' => [], 'status_code' => 200, 'message' => 'success'];
    }
}
<?php
namespace App\Transformers;

use Carbon\Carbon;
use League\Fractal\TransformerAbstract;

class TestTransformer extends TransformerAbstract
{

    public function transform($item)
    {
        return [
            'id'=>(int) $item->id,
            'date'=>(string) $item->date,
            'people'=>(string) $item->people,
        ];
    }
}

config/app.php

'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\DingoServiceProvider::class

    ],

控制器

<?php

namespace App\Http\Controllers\Api;

use App\Transformers\TestTransformer;
use Illuminate\Support\Facades\DB;
use League\Fractal\Manager;
use League\Fractal\Resource\Collection;

class ExampleController extends Controller
{

    public function test()
    {
        $data = DB::table('stadium')->get();
        return $this->response->collection($data,new TestTransformer());
    }
}

路由

$api = app('Dingo\Api\Routing\Router');

$api->version('v1', function (\Dingo\Api\Routing\Router $api) {

    $api->get('/index', \App\Http\Controllers\Api\ExampleController::class . '@index');
    $api->get('/test', \App\Http\Controllers\Api\ExampleController::class . '@test');
});

结果
file

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

请问下有没有 Laravel 的设置,我写了下面的方法就是没效果。

$this->app['Dingo\Api\Transformer\Factory']->setAdapter(function ($app) {
            $fractal = new \League\Fractal\Manager;

            $fractal->setSerializer(new \App\Serializers\DataArraySerializer);

            return new \Dingo\Api\Transformer\Adapter\Fractal($fractal);
        });
5年前 评论

@Prefect丶 我在AppServiceProvider试了下是有效果的

5年前 评论

@simaguo 这就尴尬了 :joy: 我提交了 issue 。大佬看看是不是和你写的一样

5年前 评论

@Prefect丶 文章已更新,我得真地可以。不知道你的为什么不行。

5年前 评论

@Prefect丶 我也是无法生效,你后面搞定了吗

5年前 评论

楼主,行不通啊

5年前 评论

如果使用include请求参数的话,那么每一个关联的数据都会有status_code以及message

5年前 评论

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