您的位置:首页 > 编程语言 > PHP开发

Laravel5.3开发API(Dingo+Passport+Swagger)

2016-12-01 21:33 453 查看

dingo/api

安装

composer require dingo/api:1.0.x@dev


配置

config/app.php
注册服务提供者

...
'providers' => [
...
Dingo\Api\Provider\LaravelServiceProvider::class,
...
],
...


生成配置文件
config/api.php


php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"


设置
.env


phpAPI_STANDARDS_TREE=vnd
API_SUBTYPE=biubiujun
API_PREFIX=api
API_VERSION=v1
API_NAME=BiuBiuJun
API_CONDITIONAL_REQUEST=false
API_STRICT=false
API_DEFAULT_FORMAT=json
API_DEBUG=true


API_STANDARDS_TREE - API规格

x
本地或私有环境

prs
非商业销售的项目

vnd
公开的以及商业销售的项目

API_SUBTYPE - API简称

API_PREFIX - API前缀(或使用API_DOMAIN - API子域名)

API_VERSION - API默认版本

API_NAME - API名称

API_CONDITIONAL_REQUEST - 带条件的请求,由于缓存API请求的时候会使用客户端缓存功能,所以默认开启了带条件的请求

API_STRICT - 严格模式,要求客户端发送Accept头而不是默认在配置文件中指定的版本

API_DEFAULT_FORMAT - 响应格式,默认的响应格式是JSON

API_DEBUG - 调试模式

测试

迁移
User
数据表

php artisan migrate


创建
UserTableSeeder


php artisan make:seeder UserTableSeeder


修改
database/seeds/UserTableSeeder.php


<?php
use Illuminate\Database\Seeder;

class UsesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$user = new User();
$user->name = 'BiuBiuJun';
$user->email = 'biubiujun@163.com';
$user->password = Hash::make('123456');
$user->save();
}
}


执行
seeder


php artisan db:seed


创建
UserController


php artisan make:controller Api/V1/UserController


修改
app/Http/Controller/Api/V1/UserController


<?php
namespace App\Http\Controllers\Api\V1;

use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
public function index()
{
return User::all();
}

public function show($id)
{
return User::findOrFail($id);
}
}


routes/api.php
注册路由

...
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['namespace' => 'App\Http\Controllers\Api\V1'], function ($api) {
$api->get('user/{id}', 'UserController@show');
$api->get('user', 'UserController@index');
});


查看路由列表

php artisan api:routes


访问即可

http://localhost/path/public/api/user

http://localhost/path/public/api/user/1

Passport

安装

composer require laravel/passport


配置

config/app.php
注册服务提供者

...
'providers' => [
...
Laravel\Passport\PassportServiceProvider::class,
...
],
...


迁移
Passport
相关的数据表

php artisan migrate


修改
app/User.php


<?php
namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}


创建
AuthServiceProvider


php artisan make:provider AuthServiceProvider


修改app/Providers/AuthServiceProvider[/code]

<?php

namespace App\Providers;

use Carbon\Carbon;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];

/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();

Passport::routes();

Passport::tokensExpireIn(Carbon::now()->addDays(15));

Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));

Passport::pruneRevokedTokens();
}
}


修改
config/auth.php


...
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],

'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
...


创建一个密码发放客户端

php artisan passport:client --password


配置Dingo使用Passport密码发放令牌

创建
PassportDingoProvider


php artisan make:provider PassportDingoProvider


修改
app/Providers/PassportDingoProvider.php


<?php
namespace App\Providers;

use Dingo\Api\Routing\Route;
use Illuminate\Http\Request;
use Dingo\Api\Auth\Provider\Authorization;

class PassportDingoProvider extends Authorization
{
public function authenticate(Request $request, Route $route)
{
return $request->user();
}

public function getAuthorizationMethod()
{
return 'bearer';
}
}


修改
config/api.php


...
'auth' => [
'custom' => \App\Providers\PassportDingoProvider::class
],
...


修改
App/Http/Kernel.php


...
protected $middlewareGroups = [
...
'api:auth' => [
'auth:api',
'api.auth'
]
...
];
...


routes/api.php
修改之前注册路由

...
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['middleware' => 'api:auth', 'namespace' => 'App\Http\Controllers\Api\V1'], function ($api) {
$api->get('user/{id}', 'UserController@show');
$api->get('user', 'UserController@index');
});


测试

请求令牌

curl -d "username=biubiujun@163.com@password=123456@grant_type=password&client_id=<client_id>&client_secret=<client_secret>" http://localhost/path/public/api/oauth/token[/code] 
请求用户列表

curl -H "Authorization: Bearer <token>" http://localhost/path/public/api/user[/code] 

Swagger

安装

composer require zircote/swagger-php


测试

创建
SwaggerController


php artisan make:controller SwaggerController


修改
app/Http/Controller/SwaggerController


<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;

/**
* @SWG\Info(title="My First API", version="0.1")
*/

/**
* @SWG\Get(
*     path="/api/resource.json",
*     @SWG\Response(response="200", description="An example resource")
* )
*/
class SwaggerController extends Controller
{
public function doc()
{
$swagger = \Swagger\scan(__DIR__ . '/../');

return response()->json($swagger);
}
}


下载
swagger-ui


swagger-ui

swagger-ui/dist
目录放入
public/doc


修改public/doc/index.html

...
<script src='lang/translator.js' type='text/javascript'></script>
<script src='lang/zh-cn.js' type='text/javascript'></script>
<script type="text/javascript">
$(function () {
var url = window.location.search.match(/url=([^&]+)/);
if (url && url.length > 1) {
url = decodeURIComponent(url[1]);
} else {
// url = "http://petstore.swagger.io/v2/swagger.json"
url = "/api/doc";
}
...


访问http://localhost/path/public/doc/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Laravel