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');
});
结果
请问下有没有 Laravel 的设置,我写了下面的方法就是没效果。
@Prefect丶 我在AppServiceProvider试了下是有效果的
@Prefect丶 版本是5.5
@simaguo 这就尴尬了 :joy: 我提交了 issue 。大佬看看是不是和你写的一样
@Prefect丶 文章已更新,我得真地可以。不知道你的为什么不行。
@Prefect丶 我也是无法生效,你后面搞定了吗
楼主,行不通啊
如果使用
include
请求参数的话,那么每一个关联的数据都会有status_code
以及message
的