3. laravel 5.5 多子域名 + dingo + jwt 简单环境搭建

佐手、 提交于 2020-01-21 13:22:46

环境介绍

  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 即可正常访问

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!