美文网首页Laravel
小程序Lumen API开发

小程序Lumen API开发

作者: Super三脚猫 | 来源:发表于2018-09-03 12:20 被阅读238次

Lumen API开发

Lumen.png

Laravel和Lumen的区别:Lumen轻量级框架,集合了Laravel的优美语法,支持ORM没有Blade模板引擎,我个人觉得这个框架适用于API的开发,对于相比Laravel还没有去测试。

安装Lumen

  • 安装Composer
cd /usr/local/bin

php -r“copy('https://getcomposer.org/installer','composer-setup.php');”
php -r“if(hash_file('SHA384','composer-setup.php')==='544e09ee996cdf60ece3804abc52599c22f1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061'){echo'Installer verified';} else {echo'Installer corrupt'; unlink('composer-setup。 php');} echo PHP_EOL;“
php composer-setup.php
php -r“unlink('composer-setup.php');”

composer --version 或 composer -v  // 查看是否安装成功?
  • Mac配置Path路径
sudo vim ~/.bash_profile
export PATH=~/.composer/vendor/bin:$PATH  // 黏贴这段代码
执行source ~/.bash_profile                // 更新配置文件
  • 安装Lumen项目(两种方式)
第一种方式:通过 Lumen 安装器 (不支持选择版本默认最新的)
【帮助】lumen help new
【Lumen】lumen new project // 直接new一个项目就可以了

第二种方式:Composer 安装(速度慢但可指定安装版本)
【安装指定版本】composer create-project laravel/lumen Lumen-5.5 --prefer-dist  "5.5.*"

// 目前只有通过 composer create-project 方式支持选择版本, lumen new 方式不支持。

配置完域名直接访问Lumen

Lumen-5.5.png

添加缺失的Artisan命令

执行php artisan list会发现,Lumen相比Laravel缺失了一部分make···等命令,像我这种懒人必须得想办法解决 gitHub:lumen-generators

not have-artisan.jpg
  • 执行Composer安装
composer require wn/lumen-generators
  • 注册服务提供者Providers
// 在app/Providers/AppServiceProvider.php
public function register()
{
    if ($this->app->environment() == 'local') {
        $this->app->register('Wn\Generators\CommandsServiceProvider');
    }
}
  • 展示渲染Providers
// 在bootstrap/app.php找到Register Service Providers添加下面代码
$app->register(Wn\Generators\CommandsServiceProvider::class);
  • 查看命令php artisan list
    wn-artisan.png
  • 修改Controller和Model模板源码(不改你会后悔的!)


    templates-path.png

    控制器模板:

<?php

namespace App\Http\Controllers\{{name}};

use Laravel\Lumen\Routing\Controller;

class {{name}} extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Display a listing of the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     * @author
     */
    public function index()
    {
        //
    }
}

model 模板:

<?php

namespace {{namespace}}\Models;

use Illuminate\Database\Eloquent\Model;

class {{name}} extends Model {

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [];

}
  • wn配置完的artisan操作命令
// 有个bug需要自己去控制器里再编辑下名称,着急开发懒得去翻源码了
【生成控制器】php artisan wn:controller Static/Static

开启Lumen的各种扩展必须组件

// 开启 Eloquent
$app->withEloquent();
// 开启 Session
去掉 $app->middleware(); 的 StartSession 中间件的注释
// 开启 路由中间件
去掉 routeMiddleware 的注释
// 安装 dd() 打印样式组件
composer require symfony/var-dumper
// 配置 数据库 ,复制 /config文件
去源码vendor/laravel/lumen-framework/config 复制到根目录下
  • 对于Lumen的dd打印

什么?哦,上帝!真是见鬼!怎么会有人在 Laravel 中还在用 echo + die() ?好家伙,我敢打赌,他一定没有好好看文档,我向圣母玛利亚保证。如果让我看到这群愚蠢的土拨鼠,看在上帝的份上,我会用靴子狠狠地踢他们的屁股,我发誓我绝对会。来自一个逗比的解释Lumen打印:云栖社区-dd()输出

微信小程序【第三方平台账号登录流程图】

微信授权登录流程图.png

图片来源PHP中文网:图片中的3rd_session类似于Auth2的认证_token,所以后端需要写有状态的接口时每次验证这个值(是否过期,是否正确)自己封装一个继承类去验证,整理完我再贴上继承类代码。

小程序调试必备:
  • Sunny-Ngrok

Sunny-Ngrok内网穿透工具,是一个很简单还不收费的软件。里面有体验隧道,用这个足够了。具体使用教程官方有详细的视频介绍

  • Wampserver

为什么推荐这个?因为本地打开Vagrant是虚拟机只能自己访问,如果写前后台分离为了和前端人员调试方便,开启Wampserver直接指向自己的Vagrant目录访问自己的Api会更方便别人,方便自己。

1.配置局域网访问

Win +R 打开 Cmd 输入 ipconfig 查看自己的以太网局域网IPv4
ipconfig.png
打开 httpd-vhosts 找到 Require local 替换成 Require all granted
如下:
<VirtualHost *:80>
    ServerName 192.168.10.72
    DocumentRoot D:/Vagrant/
    <Directory  "D:/Vagrant/">
        Options +Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
# 借鉴地址:
// https://jingyan.baidu.com/article/acf728fd556c93f8e410a344.html

注意:记得去自己的网络里查看是否是固定的 以太网 IPv4,如果不是请如下设置:

IP地址:192.168.10.110
子网掩码:255.255.255.0
默认网关:192.168.10.1  //里面的10 是自己公司的网段

DNS:
首选DNS服务器:114.114.114.114
备用DNS服务器:8.8.8.8

2.配置 Wampserver 的 Redis

虽然你的vagrant装了redis,但是Wampserver 是没有的,所以需要装一下php扩展,找了半天找到靠谱的:CSDN-Wampserver安装redis扩展,我就不搬过来了。
但是总不能一直开着cmd运行窗,太累太low -> Windows下Redis一直后台运行

- 到Redis目录下 安装redis服务:
redis-server --service-install redis.windows.conf --loglevel verbose
# 提示(Redis已成功安装为服务) :
[13808] 20 Sep 15:04:30.063 # Granting read/write access to 'NT AUTHORITY\NetworkService' on: "D:\Redis" "D:\Redis\"
[13808] 20 Sep 15:04:30.064 # Redis successfully installed as a service.
- 启动Redis:redis-server --service-start  关闭 -stop
  • Laravel 【laravel-sql-logger】

composer require mnabialek/laravel-sql-logger --dev
mnabialek/laravel-sql-logger
一个很好用的 Laravel sql记录日志

小程序后端登录凭证校验:

小程序接口官网地址,找到登陆凭证,里面的wx.login是前端的,后台不用管。(前提是必须了解上面的流程图)
然后找到 登录凭证校验 这个接口上面写的很详细,好像没有说是异步还是同步,但是网页打开调用了一下你会发现这是个同步的接口(同步的接口就是发送参数后微信立马回调给你参数,异步的话则需要配置回调域名并且还得打印写入到日志或者文件中才能调试参数)下面贴一下代码demo:

class LoginController extends Controller
{
    use AppletsTrait;

    const LOGIN_URL = 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code';

    /**
     * 微信登录凭证校验.
     *
     * @param  Request $request
     * @author zh
     */
    public function index(Request $request)
    {
        if(!$request->filled('code')) return response()->json(['status' => 404, 'msg' => '无效的code']);
        $code = $request->input('code');
        $url = sprintf(self::LOGIN_URL,config('applets.appId'),config('applets.appSecret'),$code);

        /**
         * send
         */
        $result = $this->https_request($url);
        $result = json_decode($result, true);
        if(!empty($result['errcode'])) return response()->json(['status' => 402, 'msg' => $result['errmsg']]);

        /**
         * 生成3rd_session
         */
        $_3rd_session = $this->_3rd_session();
        Cache::put($_3rd_session, $result, config('applets.cache'));

        /**
         * 返回参数
         *
         * @param string session_key
         * @param string openid
         */
        $result['3rd_session'] = $_3rd_session;
        return response()->json(['status' => 200, 'msg' => '请求成功', 'data' => $result]);
    }

    /**
     * 随机循环组合字符串
     * 
     * @return string
     */
    public function _3rd_session()
    {
        //生成第三方3rd_session
        $_3rd_session  = '';
        $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";

        $max = strlen($strPol)-1;
        for($i=0;$i<16;$i++){
            $_3rd_session .= $strPol[rand(0,$max)];
        }
        return $_3rd_session;
    }

    /**
     * 发送http请求
     *
     * @param  $url
     * @param  null $data
     * @return mixed
     * @author zh
     */
    public function https_request($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
}
Laravel-模型关联-远程一对多(特殊需求)

有个需求,需要远程查表。用的模型关联所以尝试了期待已久的 远程一对多,问题就是参数有点乱,官方也没有详细的讲解。所以亲自试了好久,总结写出以下注释:

情况说明:(现在有3张表)
1是主表(文章详情表)     2是中间表(评论表)    3是远程表(评论人的user表)
id,comment_id            id,user_id            id,name
需求:1想拿到评论他文章的用户名称,也就是3表的username
/**
 * 文章查询评论人信息
 * 远程一对多
 */
 public function commentUser()
 {
     return $this->hasManyThrough(
      1   'App\Applets\user',     // 远程表
      2   'App\Applets\comment',  // 中间表
      3   'id',                   // 中间表对主表的关联字段(2.id)
      4   'id',                   // 远程表对中间表的关联字段(3.id)
      5   'comment_id',           // 主表对中间表的关联字段(1.comment_id)
      6   'user_id'               // 中间表对远程表的关联字段(2.user_id)
     );
 }

* 如果把参数分为 1、2、3、4、5、6 就是:
* 1 和 2 对应
* 3 和 5 对应
* 4 和 6 对应

借着上面的分析顺道说一下别的模型关联参数:
(参数都是数字代表,有时候也可不填参数,Laravel 会根据规则自己找关联)
【hasOne】    一对一            1关联模型  2关联表的关联字段     3自己主表的id
【hasMany】   一对多            1关联模型  2关联表的关联字段     3自己主表的id
【belongsTo】 反向一对一(多)   1关联表    2主表关联的关联表ID   3关联表ID

如果有什么不太清楚,或者我写的不好的。请留言评论,随时都回复哈,谢谢

相关文章

  • 小程序Lumen API开发

    Lumen API开发 Laravel和Lumen的区别:Lumen轻量级框架,集合了Laravel的优美语法,支...

  • 开发入门

    相关文档 小程序开发API文档小程序开放工具文档小程序开发工具下载页面

  • 小程序封装request请求

    前言 小程序开发中都会调用后端工程师开发的API,小程序的开发文档提供了相对实用的API wx.request()...

  • 小程序开发(1)

    小程序注册小程序api下载开发工具未注册如何开发域名/证书问题小程序如何获取用户信息开发遇到问题其他 小程序注册 ...

  • 微信小程序(上)

    微信小程序 微信小程序应用开发简介(大腿勿喷) 小程序api 微信小程序其实挺简单的,项目大多功能官方api都提供...

  • 微信小程序云开发-数据库知识点

    1,云开发数据库 API 分为小程序端和服务端两部分,小程序端 API 拥有严格的调用权限控制,开发者可在小程序内...

  • 小程序开发-API

    请求服务器数据API wx.request是用来请求服务器数据的API,它发起的是https请求,需要在微信公众平...

  • 微信小程序 苏州实时公交API快速写出

    利用聚合数据API快速写出小程序,过程简单。1、申请小程序账号2、进入开发3、调用API。比如“苏州实时公交”小程...

  • 小程序云开发 - 数据库

    云开发-数据库 数据库 API 分为小程序端和服务端两部分,小程序端 API 拥有严格的调用权限控制,开发者可在小...

  • 《微信小程序开发文档》使用指南

    微信小程序开发文档,主要介绍了微信小程序的开发教程,微信小程序的api文档,微信的应用号开发资料等。 一、关于微信...

网友评论

    本文标题:小程序Lumen API开发

    本文链接:https://www.haomeiwen.com/subject/ynubwftx.html