美文网首页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开发

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