环境介绍
laravel 5.5.* + php 7.2 + mysql 5.7.27
1. 创建 laravel 项目 (自行 配置一下域名 如果 不会 请参考 laravel 的第一篇文章 )
composer create-project --prefer-dist laravel/laravel=5.5.* laravel-dj
2. 引入 dingo 并 进行 部分 配置 (dingo 文档)
更改 compose.json 的 require 文件
"require": { "php": ">=7.0.0", "dingo/api": "2.1.0", "fideloper/proxy": "~3.3", "laravel/framework": "5.5.*", "laravel/tinker": "~1.0" }
使用 compose update 进行更新
composer update
发布 dingo
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
添加 部分配置到 .env 文件
API_PREFIX=/ API_STANDARDS_TREE=vnd API_SUBTYPE=dj API_VERSION=v1 API_NAME="dj API" API_CONDITIONAL_REQUEST=false API_STRICT=false API_DEFAULT_FORMAT=json API_DEBUG=true
3. 配置 先后台 接口分离 (例如 laravel-dj.com/admin 和 laravel-dj.com/front )
# 如果想配置 node1.larave-dj.com 和 node2.laravel-dj.com 接口访问 请参考 多域名使用
修改 RouteServiceProvider 的 map function
public function map() { // $this->mapApiRoutes(); $this->mapFrontApiRoutes(); $this->mapAdminApiRoutes(); $this->mapWebRoutes(); }
添加 mapFrontApiRoutes 方法 和 mapAdminApiRoutes
protected function mapFrontApiRoutes() { app('Dingo\Api\Routing\Router')->group([ 'version' => 'v1', 'prefix' => 'front', 'middleware' => 'api', 'namespace' => 'App\Http\Controllers\Api\Front', ], function ($api) { require base_path('routes/api/front.php'); }); }
protected function mapAdminApiRoutes() { app('Dingo\Api\Routing\Router')->group([ 'version' => 'v1', 'prefix' => 'admin', 'middleware' => 'api', 'namespace' => 'App\Http\Controllers\Api\Admin', ], function ($api) { require base_path('routes/api/admin.php'); }); }
根据 配置文件 创建 Admin 下的 UserController 和 Front 下的 UserController 以及 路由文件 routes/api/front.php 和 routes/api/admin.php
php artisan make:controller Api/Admin/UserController --resource
php artisan make:controller Api/Front/UserController --resource
并在 Api\Admin\UserController show 方法 内写入 dd('admin' . $id);
Api\Front\UserController show 方法 内写入 dd('front' . $id);
在 routes 下创建 api 文件夹
创建 front.php 和 admin.php 并进行 部分 路由写入
#front.php
<?php $api = app('Dingo\Api\Routing\Router'); $api->group([], function ($api) { $api->get('/', function(){ return 'this is front';}); $api->get('users/{id}', 'UserController@show'); } );
#admin.php
<?php $api = app('Dingo\Api\Routing\Router'); $api->group([], function ($api) { $api->get('/', function(){ return 'this is admin';}); $api->get('users/{id}', 'UserController@show'); } );
访问 laravel-dj.com/admin 和 laravel-dj.com/front
访问 laravel-dj.com/admin/users/1 和 laravel-dj.com/front/users/1
4. 使用 transfromer 格式化 接口数据 ( transform文档 )
migrate 一下 laravel 自带的 user 表 (需要配置一下 .env 和 mysql )
php artisan migrate
手动写入 3 条 数据 到 user 表
admin 的 UserController 下 引入 dingo 的 Helpers
在 app 下 创建 Transformers 文件夹, Transformers下创建 Admin 文件夹 并 编写 UserTransform.php
#UserTransform.php
<?php namespace App\Transformers\Admin; use App\User; use League\Fractal\TransformerAbstract; class UserTransform extends TransformerAbstract { public function transform(User $user) { return [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, ]; } }
更改 admin 下的 UserController 内的 show 方法
验证 item 方法
public function show($id) { $user = User::find($id); return $this->response->item($user, new UserTransform()); }
访问 laravel-dj.com/admin/users/1
验证 paginator 方法
public function show($id) { $users = User::paginate(1); return $this->response->paginator($users, new UserTransform()); }
访问 laravel-dj.com/admin/users/1
验证 collection 方法
public function show($id) { $users = User::all(); return $this->response->colletion($users, new UserTransform()); }
访问 laravel-dj.com/admin/users/1
5. 使用 jwt 进行访问 限制 (请参考 具体安装 )
安装 jwt 的包
composer require tymon/jwt-auth:1.0.0-rc.4.1
在 config/app.php 下添加 provider
'providers' => [ ... Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ]
发布 jwt 配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
修改 config/auth.php
#auth.php
return [ 'defaults' => [ 'guard' => 'admin', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'jwt', 'provider' => 'users', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, ], ], ];
修改 App\User 让 是 让 User 支持 jwt 用户 认证
<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Authenticatable implements JWTSubject { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function getJWTIdentifier() { return $this->getKey(); } /** * Return a key value array, containing any custom claims to be added to the JWT. * * @return array */ public function getJWTCustomClaims() { return []; } }
在 admin 下的 UserController 下的 show 方法 内 手动登陆 并编写 respondWithToken 方法 返回 token
public function show($id) { $user = User::find($id); $token = auth('users')->fromUser($user); return $this->respondWithToken($token); }
protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('users')->factory()->getTTL() * 60 ]); }
访问 laravel-dj.com/admin/users/1 获取 token
修改 routes/api/admin.php 使用 jwt 进行访问限制
#admin.php
<?php $api = app('Dingo\Api\Routing\Router'); $api->group( [ ], function ($api) { $api->get('best', function(){ return 'admin best';}); $api->get('users/{id}', 'UserController@show'); $api->group([ 'middleware' => ['jwt.auth'] ], function ($api){ $api->get('users',function(){ return auth()->user()->toArray(); }); }); } );
访问 laravel-dj.com/admin
直接访问 会报错 需要加上 token
header 内 加上 Authorization:bearer Token 和 X-Requested-With:XMLHttpRequest 即可正常访问
来源:CSDN
作者:aa19891204
链接:https://blog.csdn.net/aa19891204/article/details/104060321