Lumen API开发
Lumen.pngLaravel和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命令
not have-artisan.jpg执行
php artisan list
会发现,Lumen
相比Laravel
缺失了一部分make···
等命令,像我这种懒人必须得想办法解决 gitHub:lumen-generators
- 执行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
如果有什么不太清楚,或者我写的不好的。请留言评论,随时都回复哈,谢谢
网友评论