lumen.jpeg

本文将介绍Lumen的使用和遇到的问题,重点是官方文档中没太详细介绍的内容,不定期更新。

Lumen框架使用Laravel模块构建而成。

与Laravel臃肿不同,Lumen是微框架,去繁就简,专注于构建无状态API。

在使用中依然能感受到Laravel一样的艺术感,

Lumen的性能表现也值得称赞。

如果你在构建API应用,请关注Lumen。

安装Lumen框架

全局安装Composer

curl -sS https://getcomposer.org/installer | php

mv composer.phar /usr/local/bin/composer

配置Composer中国镜像,国内用户都懂得。

composer config -g repo.packagist composer https://packagist.phpcomposer.com

建立一个目录为lumen的项目

composer create-project --prefer-dist laravel/lumen lumen

一些简单的配置

配置web服务器,支持单入口(优雅链接)

Apache配置:

打开mod_rewrite模块

配置public/.htaccess

Options +FollowSymLinks

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^ index.php [L]

Nginx:

nginx.conf

location / {

try_files $uri $uri/ /index.php?$query_string;

}

配置开发环境

Lumen把配置放到.env文件中. 根目录下包含一个.env.example文件

cp .env.example .env

.env 示例

APP_ENV=local

APP_DEBUG=false

APP_KEY=

如何判断当前程序运行环境?

$environment = app()->environment();

if (app()->environment('local')) {

// 环境是 local

// 加载 local 配置

}

if (app()->environment('local', 'staging')) {

// 环境是 local 或 staging...

}

第一个页面 hello world

在routes中添加路由规则 /app/Http/routes.php

方法1:接收闭包函数

$app->get('/hello', function() use ($app) {

return 'Hello World!';

});

方法2:指定路由到控制器方法处理

$app->get('/hello', 'HelloController@index');

一个简单的控制器动作

/app/Http/Controllers/HelloController.php

namespace App\Http\Controllers;

class HelloController extends Controller

{

public function index()

{

return 'Hello World!';

}

}

Lumen异常处理 修改异常报告

为什么引入这个问题呢?我们一般用Lumen写API接口,返回格式为JSON或XML。

Lumen默认报错是这个样子的, 不满足我们的要求了,我们想实现浏览器呈现的错误信息为JSON格式怎么办呢?

lumen-exception-default.png

首先Lumen输出JSON 响应很简单。

return response()->json(['name' => 'Abigail', 'state' => 'CA']);

再来看异常处理如何修改。

Lumen中的异常都交给App\Exceptions\Handler这个类处理

render 方法负责将指定的异常转换成HTTP响应再发送到浏览器。

我们把报错的行号,文件和错误消息都通过JSON返回:

/**

* Render an exception into an HTTP response.

*

* @param \Illuminate\Http\Request $request

* @param \Exception $e

* @return \Illuminate\Http\Response

*/

public function render($request, Exception $e)

{

$code = $e->getCode() == 0 ? 500 : $e->getCode();

$msg = sprintf("%s:%s:%s", $e->getFile(), $e->getLine(), $e->getMessage());

return response()->json(array('errorNo' => $code, 'errorMsg' => $msg));

}

刚才的错误消息变成了这样

{"errorNo":500,"errorMsg":"\/home\/vagrant\/Code\/www_data\/lumen\/app\/Http\/routes.php:18:Parse error: syntax error, unexpected '$app' (T_VARIABLE)"}

Lumen操作phpredis?

phpredis 是PHP的Redis扩展。

predis是PHP实现的Redis操作库,

由于phpredis的性能更好,所以我们有必要折腾一下。

在/bootstrap/app.php中,把phpredis注入到Lumen容器中

//Lumen中使用PhpRedis

$app->singleton('redis', function() {

try {

$redis = new \Redis();

$redis->connect('127.0.0.1', 6379);

return $redis;

} catch (Exception $e) {

echo $e->getMessage();

}

});

unset($app->availableBindings['redis']);

绑定后即可通过 app('redis') 操作Redis了。

Lumen怎么添加自定义配置?

我们看到上面的代码 $redis->connect('127.0.0.1', 6379);

像这种代码把配置信息硬编码到代码中,以后维护起来不是很好的。

我们把Redis连接修改为配置文件怎么办?

方法1:.env

$redis->connect(env('REDIS_HOST', env('REDIS_PORT')));

方法2:Laravel风格的config文件

添加文件 /config/redis.php

return [

'REDIS_HOST' => '127.0.0.1',

'REDIS_PORT' => 6379,

];

修改bootstrap/app.php, 让配置文件生效

// ...

$app->configure('redis');

return $app;

使用 config()函数来获取配置值

$redis->connect(config('redis.REDIS_HOST'), config('redis.REDIS_PORT'));

Lumen请求相关方法

Lumen Request类由Illuminate\Http\Request实现

// 所有的路由规则

app()->getRoutes();

// 当前REQUEST_URI

// app('request') 是 Illuminate\Http\Request类的实例

app('request')->getRequestUri();

// 当前route

app('request')->route();

怎么得到当前Uri的控制器、Action、路由规则

namespace App\Http\Controllers;

class HelloController extends Controller

{

public function index()

{

// 当前path

$router = explode("?", $request->getRequestUri())[0];

// 所有的router

$rts = app()->getRoutes();

// 当前route

$routeInfo = app('request')->route();

$rows = [];

foreach ($rts as $rt => $route ) {

$rows[$route['uri']] = [

'verb' => $route['method'],

'uri' => $route['uri'],

'uses' => isset($route['action']['uses']) ? $route['action']['uses'] : 'Closure',

'controller' => $this->getController($route['action']),

'action' => $thiw->getAction($route['action']),

];

}

print_r($rows);

return;

}

/**

* @param array $action

* @return mixed|string

*/

protected function getAction(array $action)

{

if (!empty($action['uses'])) {

$data = $action['uses'];

if (($pos = strpos($data, "@")) !== false) {

return substr($data, $pos + 1);

} else {

return "METHOD NOT FOUND";

}

} else {

return 'Closure';

}

}

/**

* @param array $action

* @return mixed|string

*/

protected function getController(array $action)

{

if (empty($action['uses'])) {

return 'Closure';

}

return current(explode("@", $action['uses']));

}

}

得到的所有路由规则数组

Array

(

[/] => Array

(

[verb] => GET

[uri] => /

[uses] => Closure

[controller] => Closure

[action] => Closure

)

[/hello] => Array

(

[verb] => GET

[uri] => /hello

[uses] => App\Http\Controllers\HelloController@index

[controller] => App\Http\Controllers\HelloController

[action] => index

)

)

Lumen 实现自定义LOG目录

今天先写到这里,由于本人水平有限,如果文章中有错误,还请大神指点。

大家遇到Lumen使用问题欢迎和我交流,有问题可以在评论区留言。

本文会持续更新。大家可以把这篇文章添加到收藏。

lumen php版本,PHP微框架 Lumen 使用全纪录相关推荐

  1. php lumen 框架优点,微框架Lumen 特性

    Lumen 是什么? Lumen 是一个"微框架",基于 Laravel 组件构建,是 Laravel 官方支持的微框架.Lumen 诞生的目的是更快的执行速度,它是目前所有微框架 ...

  2. phpyii框架倒叙_快速入门php框架(Lumen thinkphp Yii)

    打算从三个比较普遍常用的框架带领那些初入门的小伙伴(老鸟勿喷)快速上手一个框架,期间会分享一些自己的编码习惯,和代码思路,这三个框架分别是thinkphp(简单的轻量级国产框架).Lumen(为速度而 ...

  3. php的lumen框架,Lumen框架“服务容器”源码解析

    1.服务容器 "服务容器"是Lumen框架整个系统功能调度配置的核心,它提供了整个框架运行过程中的一系列服务."服务容器"就是提供服务(服务可以理解为系统运行中 ...

  4. Golang 微框架 Gin 简介

    Golang 微框架 Gin 简介 框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了.成长总不会一蹴而就,从写出程序获取成就感,再到精通框 ...

  5. java pippo_【Java资源大全】Pippo:Java小型开源Web微框架

    (点击上方公号,可快速关注) Pippo是一个(基于Apache协议)的Java开源Web微框架,依赖关系精简.上手速度很快.这个项目的主要目的是用Java创建一个易于使用和修改的Web微框架.Pip ...

  6. Java微框架:不可忽视的新趋势--转载

    原文:http://www.infoq.com/cn/news/2015/06/Java-Spark-Jodd-Ninja?utm_campaign=infoq_content&utm_sou ...

  7. spring-cloud Finchley.SR2版本 升级微服务到springboot 2.0

    2019独角兽企业重金招聘Python工程师标准>>> 读书笔记 spring-cloud Finchley.SR2版本 升级微服务到springboot 2.0 贴码云 https ...

  8. golang 微框架 gin

    golang 微框架 gin https://github.com/skybebe/gin-doc-cn https://github.com/gothinkster/golang-gin-realw ...

  9. php微框架 flight源码阅读

    Flight(https://github.com/mikecao/fl... 是一个可扩展的PHP微框架,快速.简单,能够快速轻松地构建RESTful web应用程序,在github上有2k sta ...

最新文章

  1. 大家对协同管理软件是怎么理解的?协同管理软件最主要需要解决企业/组织什么问题?
  2. vuecli项目文件命名_vue.js学习笔记(一)——vue-cli项目的目录结构
  3. 学习进度条(第六周)
  4. 天津工业大学19年计算机考研大纲,2019年天津工业大学《计算机原理及接口技术》考研复试大纲...
  5. Java教程分享:使用Spring框架能带来哪些好处?
  6. 把数据保存到cook_JavaScript数据存储 Cookie篇
  7. Qt 学习之路 2(80):定位器
  8. 每日两道前端面试题20190221
  9. Visual Studio Code的一个插件,让图标以Material的设计风格呈现
  10. zeal刷新不出来_推进重涂市场标准化,立邦率先推出刷新服务“八大验收标准”...
  11. No SOURCES given to target: mpeg
  12. R_ggplot2基础(一)
  13. Android监听蓝牙与设备连接状态、关闭和打开状态
  14. excel两列数据对比找不同_25岁约基奇和25岁姚明得分数据对比,结果和想象中不同...
  15. 《人生七年》纪录片总结
  16. Pycharm里面的一些超级好用的功能——(TODO注释)用法防遗忘大法
  17. 【蓝牙开发】低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
  18. Collectors.reducing总结
  19. (Hopcroft-Carp二分图匹配)Rain on your Parade
  20. win7用计算机名无法访问局域网,Win7系统在局域网内无法访问文件内容的解决方法...

热门文章

  1. 大连交通大学IPTV使用方法
  2. 微信图片去除马赛克_朋友圈分享技巧 如何快速地截图打马赛克?
  3. SF1006-ASEMI超快恢复二极管SF1006
  4. WED.文件操作补充及函数
  5. 穷人思维和富人思维的根本区别在于底层系统不一样
  6. 使用word写论文必备技巧(设置目录,目录导航)
  7. Java-汉字字符串转拼音,包括首字母和全拼
  8. dp什么意思java_%~dp0是什么意思
  9. excel排名_表格技巧—如何在Excel中快速计算排名
  10. OneDrive 正在登录