资讯专栏INFORMATION COLUMN

Lumen 初体验(二)

Cheriselalala / 2167人阅读

摘要:的现状目前是版本,是基于开发。入口文件启动文件和配置文件框架的入口文件是。在路由中指定控制器类必须写全命名空间,不然会提示找不到类。目前支持四种数据库系统以及。使用时发生错误,因为在文件中,的默认驱动是。

最近使用 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 欢迎页,但是是直接写在 LaravelLumenApplication 类中的,这不科学。

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

php$app->get("/test", array(
    "uses" => "AppHttpControllersTestController@getIndex",
));

这个和 Laravel 不同,在 Laravel 中是可以不必指定 AppHttpControllers

php$app->get("/test", array(
    "uses" => "TestController@getIndex",
));

因为在 Laravel 中,默认控制器的根命名空间为 AppHttpControllers。这个也可以设置:URL::setRootControllerNamespace("AppHttpControllers");。参见 Laravel 文档:HTTP 控制器。
但是,在 Lumen 中,这些都是没有的。我只在框架源码中找到接口 UrlGenerator 中有 setRootControllerNamespace 的定义,并没有找到实现。我猜这个应该也是换路由带来的影响,不知道后面会不会有修改。

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

php$app->group(array("namespace" => "AppHttpControllers"), function () use ($app) {
    $app->get( "/login", array(
        "as" => "login",
        "uses" => "PassportController@getLogin",
    ));
});

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

Facades
  

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

比如:

phpCache::put("key", "value", $minutes);
DB::getQueryLog()

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

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

phpuse IlluminateSupportFacadesCache;
use IlluminateSupportFacadesDB;

Cache::put("key", "value", $minutes);
DB::getQueryLog();

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

phppublic function withFacades()
{
    Facade::setFacadeApplication($this);

    if (! static::$aliasesRegistered) {
        static::$aliasesRegistered = true;

        class_alias("IlluminateSupportFacadesApp", "App");
        class_alias("IlluminateSupportFacadesAuth", "Auth");
        class_alias("IlluminateSupportFacadesBus", "Bus");
        class_alias("IlluminateSupportFacadesDB", "DB");
        class_alias("IlluminateSupportFacadesCache", "Cache");
        class_alias("IlluminateSupportFacadesCookie", "Cookie");
        class_alias("IlluminateSupportFacadesCrypt", "Crypt");
        class_alias("IlluminateSupportFacadesEvent", "Event");
        class_alias("IlluminateSupportFacadesHash", "Hash");
        class_alias("IlluminateSupportFacadesLog", "Log");
        class_alias("IlluminateSupportFacadesMail", "Mail");
        class_alias("IlluminateSupportFacadesQueue", "Queue");
        class_alias("IlluminateSupportFacadesRequest", "Request");
        class_alias("IlluminateSupportFacadesSchema", "Schema");
        class_alias("IlluminateSupportFacadesSession", "Session");
        class_alias("IlluminateSupportFacadesStorage", "Storage");
        class_alias("IlluminateSupportFacadesValidator", "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。修改即可。

目前支持的驱动有:filecookiedatabasememcachedredisarray。详情参见:会话。

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

Cookie
  

如果你想让所有的 Cookie 都加密的话, 你需要把 bootstrap/app.phpEncryptCookies 中间件去掉注释. 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 的成本是极低的。

祝玩的愉快!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20979.html

相关文章

  • Lumen 体验

    摘要:介绍为速度而生的框架。是官方给出的例子,直接拷贝命名为。一般来说,我们应该避免使用末尾带斜杠的。因为它如果找不到文件,就会自动在末尾加个斜杠,尝试寻找目录下的文件等等,具体是在中配置。方案修改修改的配置文件,将指向重启。 介绍 Lumen:为速度而生的 Laravel 框架。 Lumen 是 Laravel 的作者(Taylor Otwell)的又一力作。简单、快速、优雅的它的特点...

    Leck1e 评论0 收藏0
  • 阿里egg.js体验()

    摘要:接前一篇,阿里初体验一我们继续我们的之旅。注意到,目录里和两个文件夹,这里也是我们编写业务逻辑的主要地方。用于解析用户的输入,处理后返回相应的结果。在使用导出的模块时,需要把导出的模块名改为驼峰标准,且首字母变为小写。 接前一篇,阿里egg.js初体验(一) 我们继续我们的egg之旅。我们已经完成了对于项目结构的搭建,现在我们需要开始业务的编写。注意到,目录里controller和se...

    liaosilzu2007 评论0 收藏0
  • 学习 Lumen 用户认证 () —— 使用 jwt-auth 插件

    摘要:在开发中,用户认证是核心,是数据是否有保障的前提,目前主要有两种常用方式进行用户认证和。为了学习在中的使用,最好的办法就是在程序员同志网搜索有关插件,找个最多的那个拿来研究研究。 通过上一篇《学习 Lumen 用户认证 (一)》https://mp.weixin.qq.com/s/KVUQE2DUetNB2kqxHs0VDg的学习,大致懂了 Lumen 的用户认证主要使用 「api」的...

    姘存按 评论0 收藏0
  • lumen5.5学习(

    摘要:继续学习分割线看看是怎么输出这个数据目录下的加载了下的的自动加载加载的配置初始化应用初始化的内容指定项目基础目录注册服务容器注册异常处理实例 继续学习lumen5.5 -----------------------分割线----------------------- 看看是怎么输出Lumen (5.5.2) (Laravel Components 5.5.*)这个数据 public目录...

    shengguo 评论0 收藏0
  • Terraform体验) 第一个demo执行

    摘要:初始化在终端中执行。首次执行初始化操作,会有较长的时间去获取中定义的信息,在第一次初始化后没有信息的变化,可以跳过初始化直接开始部署。执行部署命令时,会将的列出来展示给用户,并由用户确定执行。则删除由创建的容器。通过Terraform在本地运行docker nginx前置条件: 1. 安装好windows docker 2. 安装好terraform安装docker安装windows doc...

    Tecode 评论0 收藏0

发表评论

0条评论

Cheriselalala

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<