最近使用 Lumen 做了 2 个业余项目,特此记录和分享一下。

Lumen 的介绍

在使用一项新的技术时,了解其应用场景是首要的事情。

Lumen 的口号:为速度而生的 Laravel 框架

Lumen 的定位:微框架

Lumen 的应用场景:Lumen 专为微服务或者 API 设计

Lumen 的优点:构建在 Laravel 之上, 使其具备 Laravel 强大的功能

Lumen 包含了 Laravel 的哪些功能:

Blade 模版引擎

Caching 缓存系统

Command Scheduler 计划任务

Controllers 控制器

Eloquent ORM 数据库操作

Error Handling 错误处理

Database Abstraction 数据库抽象层

Dependency Injection 依赖注入

Logging 日志系统

Queued Jobs 队列系统

以上内容来自:Lumen 的介绍,建议点击阅读详情。

Lumen 的现状

目前是1.0 版本,是基于 Laravel 5.x 开发。看 github 上作者更新的很勤快,但是这也导致文档和实际情况有不一致的情况,变动也比较频繁。吐个槽:也许,我下面说的一些情况都发生了变化。

和 Laravel 最大的区别

既然是为了快速而生,砍掉功能的必然的,功能的有或无,事先了解到即可,倒不算作最大的区别。我认为可见的最大变化是:

Lumen 没有使用 Symfony 的路由模块, 而是采用了速度更加快的 nikic/fast-route。

这个变化也延伸出其他的一些变化,比如和路由相关的一些 helper 函数也少了。

不可见的变化:我猜想框架的初始化机制应该也发生了很大的变化,但是对于使用框架并没有可见的影响。因为我没有深入去读框架源码,所以也不敢乱说。

Artisan 命令

Lumen 下的 Artisan 命令比 Laravel 的少很多。这个在项目下运行 php artisan,和 Laravel 的比较一下就知道了。

但是,有些命令没有也不影响原有功能的使用,毕竟 Artisan 命令工具只是起到辅助开发和提高效率的作用。

开发自己的 Artisan 命令

在 Laravel 中,要创建一个新的自定义命令,可以使用 make:console 这个 Artisan 命令。比如:php artisan make:console FooCommand。

但是,在 Lumen 中没有这个 Artisan 命令。于是,我在 Laravel 下使用该命令,生成了文件 app/Console/Commands/FooCommand.php。我将文件复制到 Lumen 项目中的 app/Console/Commands/ 的目录下,并按照 Laravel 的文档 Artisan 开发编写,成功运行。之后,我使用该方式创建了两个具有完整功能的 Artisan 命令(一个是爬虫并和 MySQL 交互,另一个是和 Redis 交互),目前尚没有发现有任何问题。

入口文件、启动文件和配置文件

框架的入口文件是 public/index.php。里面也只有两行代码:

php$app = require __DIR__.'/../bootstrap/app.php';

$app->run();

启动并运行。

阅读 bootstrap/app.php 文件还是很重要的,下面的内容几乎都有涉及这个文件。

Lumen 的配置文件是项目根目录下的 .env文件,官方给出了一个例子文件:.env.example。需要在 bootstrap/app.php 中将 Dotenv::load(__DIR__ . '/../');的注释去掉才能使用 .env,几乎很多操作都依赖这个,不知道为什么它默认是加上注释的。

路由定义

在 bootstrap/app.php 中,最后两行代码是:

phprequire __DIR__ . '/../app/Http/routes.php';

return $app;

路由定义在文件 app/Http/routes.php 中。里面给出了一个例子:

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

return $app->welcome();

});

路由的详情可以参见文档 HTTP 路由。

这里我想吐个槽,$app->welcome 这个可能是为了测速而耍的小伎俩,因为 welcome 这个方法只是单纯输出 HTML 欢迎页,但是是直接写在 Laravel\Lumen\Application 类中的,这不科学。

在路由中指定控制器类必须写全命名空间,不然会提示找不到类。

php$app->get('/test', array(

'uses' => 'App\Http\Controllers\TestController@getIndex',

));

这个和 Laravel 不同,在 Laravel 中是可以不必指定 App\Http\Controllers:

php$app->get('/test', array(

'uses' => 'TestController@getIndex',

));

因为在 Laravel 中,默认控制器的根命名空间为 App\Http\Controllers。这个也可以设置:URL::setRootControllerNamespace('App\Http\Controllers');。参见 Laravel 文档:HTTP 控制器。

但是,在 Lumen 中,这些都是没有的。我只在框架源码中找到接口 UrlGenerator 中有 setRootControllerNamespace 的定义,并没有找到实现。我猜这个应该也是换路由带来的影响,不知道后面会不会有修改。

如果实在不想重复写全命名空间,除了定义一个变量(或常量)外,还有一种旁门左道的方法,使用组路由:

php$app->group(array('namespace' => 'App\Http\Controllers'), function () use ($app) {

$app->get( '/login', array(

'as' => 'login',

'uses' => 'PassportController@getLogin',

));

});

毕竟是旁门左道,我其实的拒绝的。

Facades

Facades 提供一个静态接口给在应用程序的服务容器中可以取用的类

比如:

php\Cache::put('key', 'value', $minutes);

\DB::getQueryLog()

在 Lumen 中,这个功能默认是没有开启的。开启方式是去掉 bootstrap/app.php 中 $app->withFacades(); 的注释。

当然,如果不开启,也不碍事:

phpuse Illuminate\Support\Facades\Cache;

use Illuminate\Support\Facades\DB;

Cache::put('key', 'value', $minutes);

DB::getQueryLog();

Lumen 中可以使用的 Facades,查看源代码,可用清单如下:

phppublic function withFacades()

{

Facade::setFacadeApplication($this);

if (! static::$aliasesRegistered) {

static::$aliasesRegistered = true;

class_alias('Illuminate\Support\Facades\App', 'App');

class_alias('Illuminate\Support\Facades\Auth', 'Auth');

class_alias('Illuminate\Support\Facades\Bus', 'Bus');

class_alias('Illuminate\Support\Facades\DB', 'DB');

class_alias('Illuminate\Support\Facades\Cache', 'Cache');

class_alias('Illuminate\Support\Facades\Cookie', 'Cookie');

class_alias('Illuminate\Support\Facades\Crypt', 'Crypt');

class_alias('Illuminate\Support\Facades\Event', 'Event');

class_alias('Illuminate\Support\Facades\Hash', 'Hash');

class_alias('Illuminate\Support\Facades\Log', 'Log');

class_alias('Illuminate\Support\Facades\Mail', 'Mail');

class_alias('Illuminate\Support\Facades\Queue', 'Queue');

class_alias('Illuminate\Support\Facades\Request', 'Request');

class_alias('Illuminate\Support\Facades\Schema', 'Schema');

class_alias('Illuminate\Support\Facades\Session', 'Session');

class_alias('Illuminate\Support\Facades\Storage', 'Storage');

class_alias('Illuminate\Support\Facades\Validator', 'Validator');

}

}

数据库和 Eloquent

数据库相关配置信息在 .env 文件里面, DB_* 开头。 你可以定义所有的数据库连接。目前 Lumen 支持四种数据库系统:MySQL、Postgres、SQLite、以及 SQL Server。

数据库和 Eloquent ORM 和 Laravel 中的用法一样,看 Laravel 的相关文档即可。

数据库操作日志默认是关闭的,启动方式:

phpDB::connection()->enableQueryLog();

详情参见:查找日志记录。

在 Lumen 中如果需要使用 Eloquent ORM,应该去掉 bootstrap/app.php 中 $app->withEloquent(); 的注释。

详情参见:数据库使用基础。

Session

Session 默认未开启。

开启方式:去掉 bootstrap/app.php 中 $app->middleware(); 的 StartSession 中间件的注释。

使用时发生错误:Class 'Memcached' not found ,因为在 .env 文件中,Session 的默认驱动是:memcached。修改即可。

目前支持的驱动有:file、cookie、database、memcached、redis、array。详情参见:会话。

对了,说一句,重定向的功能有依赖于 Session。

Cookie

如果你想让所有的 Cookie 都加密的话, 你需要把 bootstrap/app.php 的 EncryptCookies 中间件去掉注释. Lumen 所建立的 cookie 会加密并且加上认证记号,这代表着被用户擅自更改的 cookie 会失效。

一般使用 cookie 都是伴着 Response 对象返回给客户端的:

php$response->withCookie(cookie('name', 'value', $minutes));

return $response;

如果不喜欢上面那种方式,还有另外一种:

phpCookie::queue('name', 'value');

return $response;

但是:

你需要在 bootstrap/app.php 文件里面注释掉 AddQueuedCookiesToResponse 这一行来使用此功能.

总结

最后说一下,Lumen 定位是微框架,Laravel 定位是全栈框架。使用一项技术时,得先了解一下它适用的场景。Lumen 的适用场景,官方有介绍:在什么时候使用 Lumen?。如果场景不对,那么 Lumen 的优势(比如:速度、简单)可能就发挥不出来,而劣势却会更加凸显。如果想用 Lumen 做太多太复杂的事情,还是直接上 Laravel。不然,你可能会觉得 Lumen 怎么这也没有那也不行的(尤其是用过 Laravel,这种感觉可能更甚)。好在 Lumen 本身和 Laravel 出自同门,Lumen 向 Laravel 迁移是很容易的事情,代码改动量并不大。

最后的最后,如果熟悉 Laravel,那么学习 Lumen 的成本是极低的。

祝玩的愉快!

lumen 项目根目录_Lumen 初体验(二)相关推荐

  1. lumen 项目根目录_Lumen简单使用

    路由定义 在 bootstrap/app.php 中,最后几行代码是: $app->group(['namespace' => 'App\Http\Controllers'], funct ...

  2. lumen 项目根目录_在Lumen路由中使用嵌套路由群组

    前段时间写的古诗词文api使用了,Dingo/api,tymondesigns/jwt-auth. 为了更加方便,而不是局限于Dingo/api框架中,我使用spatie/laravel-fracta ...

  3. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

  4. Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏

    上一篇<Windows Embedded CE 6.0开发初体验>之"嵌入式开发流程": http://blog.csdn.net/aawolf/archive/200 ...

  5. 一个课程,11个项目!爬虫初体验,快来!

    <11 个案例开启 Python 爬虫初体验> <人人都能做的 Vue 3 记账本实战>

  6. Windows Embedded CE 6.0开发初体验(二)CE开发环境

    CE开发环境 下面就要让今天的主角闪亮登场了--Digi CC 9P开发板.为了感谢Digi提供的开发板,还是给他们做个广告吧:这是一家以WiFi相关产品为主营业务的公司,也生产ARM架构的CPU,所 ...

  7. 树莓派驱动6轴传感器MPU6500与SPI初体验(二)

    接前回<< 树莓派驱动6轴传感器MPU6500与SPI初体验 对于一个想做嵌入开发的外围开发者,做硬件相关的应用开发真的是老太太啃骨头.一周以后凭借一点小聪明和给力的度娘,总算在树梅派上实 ...

  8. lumen 项目根目录_利用rewrite修改网站根目录,适用于laravel、lumen

    ###背景 最近几天准备做个小项目,使用国内的某平台进行版本控制.项目演示.质量管理.由于使用的是laravel框架,项目入口在public目录下,演示平台又不提供修改网站根目录的功能权限.那么能不能 ...

  9. 一位全栈工程师转岗项目经理的初体验与总结

    从上周开始,公司这边把我从全栈工程师的岗位调到了项目经理的岗位,开始尝试管理岗位,感觉换了一个岗位像是换了一份工作一样,又在次充满了干劲.开始新的项目,招纳新的项目成员,虽然都是在做软件开发的事情,但 ...

最新文章

  1. 如何调试分析Android中发生的tombstone
  2. 二十一、redis持久化之RDB
  3. json为全局变量 vue_vue package.json设置全局变量
  4. python迷宫小游戏代码_C++课程设计迷宫小游戏
  5. 一文弄懂java中的Queue家族
  6. 21行代码AC_标题 Excel地址 2017年蓝桥杯真题(解题报告+通法)
  7. php 有 stringbuffer,String、StringBuffer、StringBulider三者介绍
  8. 消息中间件学习总结(5)——RocketMQ之Apache RocketMQ背后的设计思路与最佳实践
  9. 蓝桥杯 基础练习 数列特征
  10. Ubuntu的默认root密码是多少,修改root密码
  11. 汽车配件+供应链一体化:降低库存成本,提高运营效率
  12. 应届生简历如何写实习经历?
  13. 数学建模 CUMCM2018年A题真题(本文由西南民族大学白白不加糖、薄荷CC糖原创)
  14. emacs go-mode 设置tab宽度
  15. 供应链金融你了解多少?
  16. 电脑配置ip--host修改ip地址然后刷新操作-win10
  17. win7如何进入计算机配置,教您win7怎么进入设置bios
  18. Python爬取淘宝图片
  19. glibc-2.15.tar.gz
  20. 豆瓣(douban.com)和Python、Quixote的文章合集

热门文章

  1. 从苦寻ADSL拨号王想到的 -- 需到用时方恨知道的少啊
  2. python爬取QQ空间好友说说并生成词云
  3. [solved] login to server failed: EOF
  4. mysql备份导出数据库结构_MySql数据库导出完整版(导出数据库,导出表,导出数据库结构)详解...
  5. 计算机一级汉字录入在线联系,计算机一级考试指导:汉字录入题的操作(3)
  6. 学习经验分享之四:YOLOv7学习心得
  7. git 提交时报错 error: failed to push some refs to ‘https://github.com/xxx/demo.git 解决方法
  8. VLINK 的更新版本
  9. 1183: 【入门】判断能否构成三角形
  10. Python 汉字转拼音库 pypinyin, 附:汉字拼音转换工具