Lumen和Laravel之间的区别与相似之处

197

我读了文档,看起来Lumen是更少功能的Laravel。我可能漏掉了什么。 我正在寻找一个比较表格,比较Laravel和Lumen的组件和功能。有人知道它们之间的区别吗?


3
这似乎不太正确。Laravel 是一个功能齐全的框架,而 Lumen 则被吹嘘为从 Laravel 派生出来的微型框架,它通过牺牲一些可配置性和可扩展性来实现。 - fijas
3
Lumen基本上就是功能更少的Laravel。这就是重点。 - Frank
3
好的,我会尽力进行翻译。以下是所需翻译内容:http://lumen.laravel.com/docs/introduction - lukasgeiter
https://laracasts.com/lessons/introducing-lumen - Ranjeet Karki
8个回答

198

更新(5.2)

最新版本的Lumen(5.2)专注于无状态API。文档指出:

Lumen 5.2将精简Lumen,专注于仅提供无状态JSON API。因此,会话和视图不再包含在框架中。如果您需要访问这些功能,则应使用完整的Laravel框架。


原始答案(≤5.1)

Lumen 的核心是速度。它比 Laravel 更快,可以处理更多的请求。

Laravel 是一个框架,将许多组件(第三方和 Laravel 自己的组件)粘合在一起。现在 Lumen 使用了许多相同的组件,但是将引导过程简化到最小。你可以说它是“不同的胶水”,这些组件(因此很多功能)大部分都是相同的。

通过减少框架的灵活性,以及改变默认的启动过程,实现了性能的提高。

除此之外,默认情况下禁用了更多的功能,必须在使用之前激活。例如:Facades(如 DB::table()
你需要先取消注释 bootstrap/app.php 中的这行代码才能启用它们:

// $app->withFacades();

同样适用于Dotenv环境文件和Eloquent。
对于路由,Lumen使用nikic/FastRoute而不是Symfony的路由器,因为它表现更好,并给微框架带来了另一个重大提升。
除此之外,几乎所有内容都与Laravel相同。
关于Lumen的好文章。

7
如果我们开始取消注释以恢复功能,那么速度会快吗? - Sam Dark
1
@SamDark 显然,每启用一个功能,速度都会变慢一些。但由于禁用的功能只是性能优化的一部分,因此它仍然非常快。 - lukasgeiter
1
@SamDark 这篇博客文章解释了如何对Lumen进行基准测试。正如您所看到的,测试应用程序只返回“Hello World”,没有使用模型或其他框架功能,因此在实际应用程序中的性能会更慢(尽管在大多数情况下不会明显。您的应用程序仍然非常快)。 - lukasgeiter
@lukasgeiter,我的理解是,如果我正在使用RESTful Laravel API构建Ionic应用程序,那么使用Lumen会更有意义? - mtpultz
1
希望能看到有关Laravel和Lumen在8.x版本中相似性和差异方面的更新。 - Howard
显示剩余4条评论

48

Lumen不是为了取代Laravel,相反地,它是一个更加专业化(和精简的)框架,专门设计用于微服务和API。它削减了API不必要的功能,比如HTTP会话和Cookie,也限制了配置选项的数量。直接使用Lumen,以速度为代价牺牲了Laravel的灵活性。

然而,你可以添加Laravel组件到Lumen中来扩展它,所以它可以被用于除了微服务和API之外的其他方面。但是,如果你的目标是将Lumen扩展成网站,那么最好还是使用Laravel。

它们也有不同的用途。Lumen和Laravel旨在搭配使用。对于频繁调用的API和服务,请使用Lumen;对于用户界面应用,请使用Laravel。


这个答案摘自我写的一篇博客文章,解释了Lumen和Laravel之间的区别。


据我所知,Cookies、Sessions等仍然存在。但是它们将被延迟加载,只有在使用时才会真正影响性能。 - lukasgeiter
1
Lumen是我现在首选的框架。我不使用Eloquent(或任何ORM),所以Lumen非常适合我。 - prograhammer
2
假设我正在构建一个Web应用程序,并决定编写API以进一步分离逻辑(并允许轻松地使用第三方应用程序)。使用Lumen编写API,使用Laravel编写网站,这样做是否是良好的实践? - Tyler Crompton
1
这是一个替代品。它使用不同的路由器,但基于Laravel。实际上几乎没有什么被剥离掉 - 只是变成了可选项。当有一个据称更快的Laravel(Lumen)可用时,没有合理的理由使用Laravel。 - Rick Jolly

15

引述Matt Stauffer的话:

Lumen和Laravel有相同的基础,以及许多相同的组件。但是Lumen是为微服务构建的,不太适用于用户界面应用程序(虽然它可以用于任何应用)。因此,类似Bootstrap和Elixir这样的前端套件以及身份验证和会话启动文件不会在开箱即用时启用,并且扩展和更改启动文件的灵活性较小。

您可以在这里阅读更多信息。


4
此外,Lumen不使用Symfony的路由组件,而是采用nikic/fast-route以获得更高的性能。 - Limon Monte
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - prograhammer
然而,使用Lumen后,我可以告诉你有些令人沮丧的地方。到目前为止,我发现许多请求/路由/助手与Laravel提供的相比不完整。例如,您无法执行redirect()->intended。我希望Lumen在这些领域能够赶上。我真的很喜欢没有ORM(Eloquent)的Laravel,所以Lumen对我非常有吸引力。 - prograhammer
2
@prograhammer,我认为Lumen不会包含那个特定的功能。我认为那需要一个会话,而Lumen故意放弃了这个功能。此外,我不认为在API中使用redirect()->intended()有太多用处,而这正是Lumen关注的重点。 - Tyler Crompton
1
Lumen适用于API而不是前端。 - Lakin Mohapatra

6

Laravel 9.xLumen 9.x

路由

基础

特性 Laravel Lumen
GET Route::get($uri, $callback) $router->get($uri, $callback)
POST Route::post($uri, $callback) $router->post($uri, $callback)
PUT Route::put($uri, $callback) $router->put($uri, $callback)
PATCH Route::patch($uri, $callback) $router->patch($uri, $callback)
DELETE Route::delete($uri, $callback) $router->delete($uri, $callback)
OPTION Route::option($uri, $callback) $router->option($uri, $callback)
多个HTTP动词 Route::match($types, $uri, $callback) ns
所有HTTP动词 Route::any($uri, $callback) ns

重定向路由

特性 Laravel Lumen
基础功能 Route::redirect($from, $to, $status); ns
永久重定向 Route::permanentRedirect($from, $to); ns

查看路由

特性 Laravel Lumen
基础功能 Route::view($from, $to); ns

路由参数

功能 Laravel Lumen
参数 ns ns
参数和依赖注入 ns ns
必填参数 ns ns
正则表达式限制 ns ns
全局约束 ns ns

命名路由

功能 Laravel Lumen
基本使用 Route::get($uri, $callback)->name('profile') $router->get($uri, ['as' => 'profile', $callback])
生成命名路由的URL route('profile') route('profile')
通过名称检查当前路由 $request->route()->named('profile') 布尔值 ns

路由组

特点 Laravel Lumen
中间件 Route::middleware($middleware) $router->group(['middleware' => $middleware], $callback)
控制器 Route::controller(ProfileController::class) ns
子域名路由 Route::domain('{account}.example.com') ns
命名空间 Route::namespace($namespace) $router->group(['namespace' => $namespace], $callback)
路由前缀 Route::prefix('admin') $router->group(['prefix' => 'admin'], $callback)
路由名称前缀 Route::name('admin.') ns

路由模型绑定

特点 Laravel Lumen
隐式绑定 ns ns
隐式枚举绑定 ns ns
显式绑定 ns ns

后备路由

特性 Laravel Lumen
基础 Route::fallback() ns

路由缓存

特性 Laravel Lumen
基础 ns ns

中间件

特性 Laravel Lumen
定义中间件 artisan make:middleware 手动
全局中间件 ns ns
分配中间件到路由 ns ns
中间件组 ns ns
中间件参数 ns ns
可终止的中间件 ns ns

CSRF保护

特性 Laravel Lumen
基本 ns ns

自 Lumen 版本 5.2 起,已删除 CSRF(跨站点请求伪造)功能。


控制器

特性 Laravel Lumen
定义控制器 artisan make:controller 手动
基本 ns ns
单动作控制器 ns ns
控制器中间件 ns ns
资源控制器 ns ns
依赖注入与控制器 ns ns

请求

功能 Laravel Lumen
访问请求 ns ns
请求路径和方法 ns ns
请求头 ns ns
请求IP地址 ns ns
内容协商 ns ns
PSR-7请求 ns ns
检索输入 ns ns
确定是否存在输入 ns ns
合并额外的输入 ns ns
旧的输入 ns ns
Cookies ns ns
输入修剪和规范化 ns ns
检索上传的文件 ns ns
移动上传的文件 ns ns

响应

特性 Laravel Lumen
将标头附加到响应 ns ns
将cookie附加到响应 ns ns
重定向 ns ns
查看响应 ns ns
JSON响应 ns ns
文件下载 ns ns
文件响应 ns ns

视图和Blade模板

特性 Laravel Lumen
基本 ns ns
Blade模板引擎 ns ns

会话(Session)

功能 Laravel Lumen
基本 ns ns

自 Lumen 版本5.2开始,已删除会话(Session)功能。


验证(Validation)

特点 Laravel Lumen
基本功能 ns ns
表单请求 ns ns
$this->validate方法 ns Lumen中可用的$this->validate助手将始终返回带有相关错误消息的JSON响应。与Laravel版本的该方法相比,如果请求不是AJAX请求,则会返回重定向响应。由于Lumen是无状态的且不支持会话,因此闪存错误到会话不可能。与Laravel不同,Lumen提供了在路由闭包内访问 validate方法的方式。
existsunique规则 ns 如果要使用existsunique验证规则,则应取消注释bootstrap/app.php文件中的$app->withEloquent()方法调用。
$errors视图变量 ns Lumen不支持会话,因此在Lumen中不可用每个视图中都可用的$errors视图变量。如果验证失败,则$this->validate助手将抛出Illuminate\Validation\ValidationException,并嵌入了包含所有相关错误消息的JSON响应。

错误和日志记录

特点 Laravel Lumen
错误处理 ns ns
日志记录 ns ns

Artisan控制台

特点 Laravel Lumen
运行命令 ns ns
编写命令 ns ns

缓存

特点 Laravel Lumen
基本 ns ns

在使用Cache门面之前,请确保您已经取消注释了bootstrap/app.php文件中的$app->withFacades()方法调用。

Redis支持

在使用Lumen和Redis缓存之前,您需要通过Composer安装illuminate/redis包。然后,在bootstrap/app.php文件中注册Illuminate\Redis\RedisServiceProvider

$app->register(Illuminate\Redis\RedisServiceProvider::class);

如果您在bootstrap/app.php文件中没有调用$app->withEloquent(),则应该在bootstrap/app.php文件中调用$app->configure('database');来确保正确加载Redis数据库配置。

编译资产

特性 Laravel Lumen
Mix ns ns

事件

特性 Laravel Lumen
基本 ns ns
生成器

Lumen中没有生成器命令为您生成事件和侦听器,因此您只需复制ExampleEventExampleListener类来定义自己的事件和侦听器。这些示例类提供了每个事件和侦听器的基本结构。

注册事件/侦听器

与Laravel框架一样,包含在您的Lumen应用程序中的EventServiceProvider提供了一个方便的地方来注册所有事件侦听器。 listen属性包含所有事件(键)及其侦听器(值)的数组。当然,您可以将任意多个事件添加到此数组中以满足您的应用程序的要求:

protected $listen = [
    'App\Events\ExampleEvent' => [
        'App\Listeners\ExampleListener',
    ],
];
触发事件

你可以使用 event 辅助函数或 Event 门面在 Lumen 应用程序中触发事件。与完整版 Laravel 框架的等效函数一样,这些函数的行为也是相同的。

event(new ExampleEvent);
Event::dispatch(new ExampleEvent);

认证与授权

功能 Laravel Lumen
认证 ns ns
授权 ns ns
认证

Lumen中的认证和Laravel使用相同的底层库,但配置方式不同。由于Lumen不支持会话状态,您希望进行身份验证的传入请求必须通过无状态机制(例如API令牌)进行身份验证。

授权
定义权限

Lumen中授权与Laravel的主要区别在于如何定义权限。在Lumen中,您可以直接在AuthServiceProvider中使用Gate门面来定义权限:

Gate::define('update-post', function ($user, $post) {
    return $user->id === $post->user_id;
});
定义策略

与 Laravel 不同,Lumen 在其 AuthServiceProvider 上没有一个 $policies 数组。但是,您仍可以在提供程序的 boot 方法中从 Gate 门面调用 policy 方法:

Gate::policy(Post::class, PostPolicy::class);
检查权限

您可以像在完整的Laravel框架中一样 "检查" 权限。首先,您可以使用Gate门面。如果您选择使用该门面,请确保在您的bootstrap/app.php文件中启用门面。请记住,我们不需要将User实例传递给allows方法,因为当前已认证的用户将自动传递给您的授权回调函数:

if (Gate::allows('update-post', $post)) {
    //
}

if (Gate::denies('update-post', $post)) {
    abort(403);
}

当然,您也可以检查特定的User实例是否具有特定的权限:
if ($request->user()->can('update-post', $post)) {
    // The user is allowed to update the post...
}

if ($request->user()->cannot('update-post', $post)) {
    abort(403);
}

数据库

特点 Laravel Lumen
基本查询 ns ns
查询构造器 ns ns
Eloquent ORM ns ns
迁移 ns ns
种子 ns ns

如果您想要使用DB外观,应取消注释bootstrap/app.php文件中的$app->withFacades()调用。


邮件验证和密码重置

特点 Laravel Lumen
邮件验证 ns ns
密码重置 ns ns

加密和哈希

特性 Laravel Lumen
加密 ns ns
哈希 ns ns

你需要将.env文件中的APP_KEY设置为一个32位随机字符串。如果这个值没有被正确设置,Lumen进行的所有加密都将不安全。


邮件

特性 Laravel Lumen
基础 ns ns

队列

特性 Laravel Lumen
基础 ns ns

Lumen不支持闭包作业。

生成器

Lumen不包括自动创建新作业类的生成器。相反,你应该复制框架中包含的ExampleJob类。

分派作业

同样,你应该查阅完整的Laravel队列文档以了解有关分派队列作业的完整信息。然而,就像在Laravel框架中一样,你可以使用dispatch函数从Lumen应用程序中的任何位置分派作业:

dispatch(new ExampleJob);

当然,您也可以使用 Queue 门面(facade)。如果选择使用门面,请确保在您的 bootstrap/app.php 文件中取消注释调用 $app->withFacades() 的代码:

Queue::push(new ExampleJob);

服务容器

特性 Laravel Lumen
基本 ns ns
访问容器

Laravel\Lumen\Application 实例是 Illuminate\Container\Container 的扩展,因此它可以作为应用程序的服务容器。

解析实例

要从容器中解析出东西,您可以在已由容器自动解析的类(例如路由闭包、控制器构造函数、控制器方法、中间件、事件监听器或排队作业)上对需要的依赖项进行类型提示。或者,您可以在应用程序的任何地方使用 app 函数:

$instance = app(Something::class);

测试

特性 Laravel Lumen
基础功能 ns ns

4

Lumen微框架是Laravel全栈框架的轻量化版本。Lumen使用Laravel语法和组件,并且可以轻松地升级到Laravel。

Lumen是一种更专业(和精简)的框架,专门用于微服务开发和API开发。因此,Laravel中的某些功能,例如HTTP会话、cookie和模板不需要,Lumen将它们移除,只保留必要的内容:路由、日志、缓存、队列、验证、错误处理等等。


2
Lumen是一个微框架,与Laravel有相同的基础和许多相同的组件。
但Lumen是为微服务而构建的,不太适用于用户界面应用程序。它是Laravel的大幅精简版本,删除了API不需要的功能,如HTTP会话和cookie,并限制了配置选项的数量。Lumen利用了许多相同的组件,但将引导过程削减到最小。
它旨在成为轻量级API处理系统,因此您希望代码尽可能快地启动并能够尽快将数据返回给用户。
简而言之,您具有相同的路由管理和相同的MVC功能,包括限流等中间件功能,但默认情况下关闭了Eloquent等内容,虽然有一种设置可以打开它-例如,不必通过composer添加它。您也不会得到像tinker这样的东西以及artisan命令。
一些主要区别:
Laravel是一个全栈Web应用程序框架,封装或支持许多第三方工具和框架,而Lumen是一个微框架,用于开发微服务和API开发,旨在提供速度和高响应时间。
Laravel需要针对服务器和其他工具的不同配置,而Lumen微框架是Laravel版本的轻量级形式,提供专业功能,如API开发、cookie、模板、缓存、日志记录、路由、HTTP会话等。
Laravel可以与更多的工具集成,而Lumen与其他工具的集成功能较少。
在SQL查询和从应用程序级别调整数据库方面,Laravel的性能将很好,而Lumen的性能则会因SQL查询和相对于Laravel的较少功能而下降。
在Lumen中,如果需要Eloquent,则必须启用它。在Lumen中,您没有Blade模板引擎。
Laravel适用于构建RESTful API,而Lumen是构建微服务的最高性能微框架API之一。
虽然使用与Laravel相同的基础库,但Lumen中的身份验证与完整的Laravel框架有所不同。由于Lumen不支持会话状态,因此希望进行身份验证的传入请求必须通过无状态机制(如API令牌)进行身份验证。
Lumen没有内置的事件排队功能,而Laravel有。

0

为什么选择 Lumen?

Lumen 是构建基于 Laravel 的微服务和极速 API 的完美解决方案。实际上,它是最快的微框架之一。编写支持 Laravel 应用程序的惊人快速服务从未如此简单。文档

Lumen 是一个构建 API 的框架,它将为您的请求提供 JSON 响应。就是这样。

这些类型的应用程序通常被称为 Web 服务

截至 Lumen 5.2 更新,它不支持 Laravel 视图、会话等功能...如果需要这些功能,您将需要升级到完整的 Laravel 框架。

某些 Laravel 框架组件已被其他包替换以提高性能。在这里查看它们

可以考虑使用 Lumen 的示例场景

  • 你可能想通过API向其他开发者开放一些应用程序的功能
  • 你的应用程序需要同时支持Web和移动应用程序,将数据存储在Lumen API封装的数据库中会更完美。
  • 当你将可扩展性视为重要因素时,你可能需要使用Lumen。

-3

Laravel和Lumen之间的主要区别在于,Laravel可以使用Artisan命令,而Lumen则不支持。


这不是真的,或者至少不是最新的情况。我不太了解旧版本,但我安装了lumen 7.x并且我有artisan命令。 - BonisTech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接