Laravel6 简单使用 API 注册访问实现(适合菜鸟)

本篇文章只适合刚入门的菜鸟查看。大神熟练工请忽略。

感悟

本人是一名对编程爱好者,从2004年就开始捣鼓程序这块。
不是靠这个吃饭。学习这个一方面有兴趣,另一方对工作生活有很多帮助。
从最早的VB,简单HTML,到后来的Flash ActionScript,在到后来java、C#都有过简单的了解和学习。
后来就感受到PHP的魅力,在后来HTML5和CSS3学的最好。
在后来了解了MVC思想,然后就用了TP,从3到5都用过。坑的真很多。。。过程很痛苦。
微信公众号火的那一阵,开发过微信服务号的应用,还赚点小钱。挺有成就感的。
最近自己在工作上有一个需求,比较灰色的需求,只能自己搞。
但是我真的不想用TP,至于什么原因你们懂的,我只能说国产的氛围很糟糕。
然后选来选去,确定了用laravel,直接从6搞起。反正我的程序,使用的圈子也不大。
经过几天捣鼓,我才发现。。。这玩意真特么好啊,果然名气大不是盖的。
然后就是捣鼓,首先顺利搞了传统的web方式实现,很轻松就搞定了。目前程序正在顺利使用中。
但是我不甘心啊,我想搞明白当下最流行的MVVC。
然后就去捣鼓什么Node,Webpack,但是我发现,我应该首先从服务器做好API接口才对,至于前端这块,对于我这样 简单的应用来讲,问题不大。
我就不停的找资料啊,看啊。。。
哎。。。受不了,绝大部分资料都不是laravel6之前的,好多东西又都对不上。
没办法,只能找一个差不多的,然后自己不停的去尝试。
现在把简单的API接口实现记录如下。

建立模型和对应的测试数据

admins表

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Str;

/**
 * @property string api_token
 */
class Admin extends Model
{
    use SoftDeletes;

    //指定表明
    //protected $table = 'admins';

    //指定主键名
    //protected $primaryKey = 'id';

    //维护默认的时间戳
    public $timestamps = true;

    //黑白名单 仅在添加create方法时有效
    //protected $fillable = ['name', 'type'];
    protected $guarded = [];

    //在生成及保存token
    public function generateToken()
    {
        $this->api_token = Str::random(60);
        $this->save();
        return $this->api_token;
    }

}

hfs表

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Hf extends Model
{
    use SoftDeletes;

    //protected $dates = ['deleted_at'];

    //指定表明
    //protected $table = 'show';

    //指定主键名
    protected $primaryKey = 'id';

    //维护默认的时间戳
    public $timestamps = true;

    //黑白名单 仅在添加create方法时有效
    //protected $fillable = ['name', 'type'];
    protected $guarded = [];

}

以上数据对应 Admin.php Hf.php 两个模型

建立模型

Admin.php

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Str;

/**
 * @property string api_token
 */
class Admin extends Model
{
    use SoftDeletes;

    //指定表明
    //protected $table = 'admins';

    //指定主键名
    //protected $primaryKey = 'id';

    //维护默认的时间戳
    public $timestamps = true;

    //黑白名单 仅在添加create方法时有效
    //protected $fillable = ['name', 'type'];
    protected $guarded = [];

    //在生成及保存token
    public function generateToken()
    {
        $this->api_token = Str::random(60);
        $this->save();
        return $this->api_token;
    }

}

Hf.php

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Hf extends Model
{
    use SoftDeletes;

    //protected $dates = ['deleted_at'];

    //指定表明
    //protected $table = 'show';

    //指定主键名
    protected $primaryKey = 'id';

    //维护默认的时间戳
    public $timestamps = true;

    //黑白名单 仅在添加create方法时有效
    //protected $fillable = ['name', 'type'];
    protected $guarded = [];

}

建立控制器

Admin控制器

<?php

namespace App\Http\Controllers\Api;

use App\Model\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\Admin as AdminResources;
use DB;

class AdminController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function index()
    {
        return new AdminResources(Admin::query()->find(1));
    }

    /**
     * Show the form for creating a new resource.
     *
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function show($id)
    {
        $res = DB::table('admins')->where('id', $id)->first();
        if ($res === null) { //检查传过来的ID是否能查找出数据
            //throw new ApiException('非法操作');
            return response(['message' => '非法操作'], 422);
        } else {
            return new AdminResources(Admin::query()->find($id));
        }
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

HfController

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Model\Hf;
use Illuminate\Http\Request;
use App\Http\Resources\Hf as HfResource;
use DB;

class HfController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function show($id)
    {
        $res = DB::table('hfs')->where('id', $id)->first();
        if ($res === null) {
            //throw new ApiException('非法操作');
            return response(['message' => '非法操作'], 422);
        } else {
            return new HfResource(Hf::query()->find($id));
        }
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param int $id
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

建立中间件

用来检测是否ajax访问和是否携带token请求,别忘了注册中间件

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAjax
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) mixed
     */
    public function handle($request, Closure $next)
    {
        if (!$request->ajax()) { //检测是否ajax访问
            return response(['message' => '非法访问']);
        }
        return $next($request);
    }
}
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CheckToken
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::guard('api')->guest()) { //检测是否携带token请求
            return response([
                'message' => '没有访问权限'
            ]);
        }
        return $next($request);
    }
}

注册路由中间件,顺序我放在上面

protected $routeMiddleware = [
        'checkAjax' => \App\Http\Middleware\CheckAjax::class,
        'checkToken' => \App\Http\Middleware\CheckToken::class,
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

建立API资源类

Admin.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

/**
 * @property mixed id
 * @property mixed api_token
 * @property mixed name
 * @property mixed email
 * @property mixed created_at
 * @property mixed updated_at
 */
class Admin extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param \Illuminate\Http\Request $request
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'api_token' => $this->api_token,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

Hf.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

/**
 * @property mixed returnNo
 * @property mixed verCode;
 * @property mixed account;
 * @property mixed cardNo;
 * @property mixed bank;
 * @property mixed type;
 * @property mixed lowMoney;
 * @property mixed upMoney;
 * @property mixed transDate;
 * @property mixed serialNo;
 * @property mixed description;
 * @property mixed printDate;
 * @property mixed sort;
 * @property mixed project;
 * @property mixed lot;
 * @property mixed pTime;
 * @property mixed created_at;
 * @property mixed updated_at;
 */
class Hf extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param \Illuminate\Http\Request $request
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) array
     */
    public function toArray($request)
    {
        return ['returnNo' => $this->returnNo,
            'verCode' => $this->verCode,
            'account' => $this->account,
            'cardNo' => $this->cardNo,
            'bank' => $this->bank,
            'type' => $this->type,
            'lowMoney' => $this->lowMoney,
            'upMoney' => $this->upMoney,
            'transDate' => $this->transDate,
            'serialNo' => $this->serialNo,
            'description' => $this->description,
            'printDate' => $this->printDate,
            'sort' => $this->sort,
            'project' => $this->project,
            'lot' => $this->lot,
            'pTime' => $this->pTime,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
//        return parent::toArray($request);
    }
}

修改auth.php

<?php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

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

        'api' => [
            'driver' => 'token',
            'provider' => 'admins',
            'hash' => false,
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Model\Admin::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

    'password_timeout' => 10800,

];

添加自定义异常提示

<?php

namespace App\Exceptions;

class ApiException extends Exception
{
    public function __construct($message = "")
    {
        parent::__construct($message);
    }
}
<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param \Exception $exception
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Exception $exception
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        if ($exception instanceof ApiException) {
            $result = [
                "data" => $exception->getMessage(),
            ];
            return response($result, 422);
        }

        return parent::render($request, $exception);
    }
}

添加路由

<?php

use Illuminate\Http\Request;

Route::middleware('checkAjax')->group(function () { //检测是否为ajax访问

    Route::post('register', 'Auth\RegisterController@register'); //注册

    Route::namespace('Api')->group(function () { //规范
        // 在 「App\Http\Controllers\Api」 命名空间下的控制器
        Route::prefix('admin')->group(function () { //admin空间
            Route::get('/', 'AdminController@index');
            Route::get('show/{id}', 'AdminController@show');
        });

        Route::middleware('checkToken')->group(function () { //数据访问必须要有token
            Route::prefix('hf')->group(function () { //恒丰银行数据
                Route::get('show/{id}', 'HfController@show');
            });
        });
    });
});

准备工作齐活

开始测试

Laravel6 简单使用 API 注册访问实现(适合菜鸟)

Laravel6 简单使用 API 注册访问实现(适合菜鸟)

Laravel6 简单使用 API 注册访问实现(适合菜鸟)

Laravel6 简单使用 API 注册访问实现(适合菜鸟)

Laravel6 简单使用 API 注册访问实现(适合菜鸟)

Laravel6 简单使用 API 注册访问实现(适合菜鸟)

Laravel6 简单使用 API 注册访问实现(适合菜鸟)

搞定

按照以上做就可以在laravel6跑起来

里面肯定存在一些问题,毕竟偶不是专业的。

对于简单的应用应该可以用了,下面就可以安心搞前端了。

希望能够帮助到和我一样的菜鸟便宜们。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4

你这种TOKEN是固定的,而且没有过期时间,直接暴露url上,很容易被人直接获取,建议使用JWT

4年前 评论
小李世界 4年前
aidybnt (楼主) 4年前

这年头还有 Hf 表。

我建议 TP 大佬可以用 passport,更省心。 :see_no_evil:

4年前 评论
aidybnt (楼主) 4年前
小李世界 (作者) 4年前
aidybnt (楼主) 4年前
小李世界 (作者) 4年前

竟然还用DB来操作

4年前 评论
aidybnt (楼主) 4年前
Epona

Laravel 自带了一个Token 认证,可以看看文档。 你会少写很多代码

4年前 评论

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