Lumen与Laravel的异同

我阅读了文档,似乎Lumen是功能较少的Laravel.我一定是错过了什么。 我正在寻找Laravel和Lumen的组件和功能的比较表。有人知道其中的区别吗?

73262 次浏览

引用马特·斯托弗的话

Lumen拥有与Laravel相同的基础,以及许多相同的组件。但Lumen是为微服务而构建的,而不是为面向用户的应用程序而构建的(尽管它可以用于任何用途)。因此,前端细节(如Bootstrap和Elixir以及身份验证引导程序和会话)不是开箱即用的,并且扩展和更改引导程序文件的灵活性较低。

您可以阅读更多在这里

更新(5.2)

在最新版本的Lumen(5.2)中,微框架专注于无状态API.
文档表示:

流明5.2代表了精简流明的转变,只专注于服务无状态的JSON API.因此,会话和观点不再包含在框架中。如果您需要访问这些功能,您应该使用完整的Laravel框架。


原始答案(<;= 5.1)

流明是关于速度的。。它比Laravel更快,每秒可以处理更多的请求。

Laravel是一个将许多组件(第三方和Laravel自己的组件)粘合在一起的框架。现在,Lumen使用了许多相同的组件,但将自举过程降至最低。你可以说它是一种“不同的胶水”,组件(因此许多功能)基本上是相同的。

性能改进是通过取消框架在配置方面的一些灵活性并更改默认引导过程来实现的。

除此之外,更多的功能在默认情况下被禁用,并且必须在使用之前激活。例如:门面(类似于DB::table()
您首先需要在bootstrap/app.php中取消注释此行以启用它们:

// $app->withFacades();

Dotenv环境文件和Eloquent也是如此。

对于路由,Lumen使用Nikic/Fastroute,而不是Symfonys Router,因为它的性能要好得多,并为微框架提供了另一个巨大的提升。

除此之外,几乎一切都和Laravel一样。

关于流明的良好阅读

Lumen并不是为了取代Laravel而设计的,相反,它是一个为微服务和API设计的更专业(和精简)的框架。它去掉了API不需要的功能,如HTTP会话和cookie,还限制了配置选项的数量。开箱即用,Lumen为了速度牺牲了Laravel的灵活性。

但是,您可以将Laravel组件添加到Lumen以对其进行扩展,因此不仅仅用于微服务和API.但是,如果您的目标是将Lumen扩展为一个网站,您不妨使用Laravel.

它们也有不同的使用情形。Lumen和Laravel注定要一起工作对于经常被调用的API和服务,请使用流明。对于面向用户的应用程序,请使用Laravel.


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

Lumen MicroFramework是Laravel Full-Stack Framework的轻量级版本。Lumen使用Laravel语法和组件,可以轻松“升级”到Laravel.

Lumen是专为微服务开发和API开发而设计的更专业(且精简)的框架。因此,Laravel中的一些功能(如HTTP会话、Cookie和模板)是不需要的,Lumen将其删除,保留了必要的功能-路由、日志记录、缓存、队列、验证、错误处理和其他一些功能。

为什么是流明?

Lumen是构建基于Laravel的微服务和超快API的完美解决方案。事实上,它是目前最快的微框架之一。编写速度惊人的服务来支持您的Laravel应用程序从未如此简单。医生

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

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

从Lumen 5.2更新开始,它不支持Laravel视图、会话等。为此,您必须升级到完整的Laravel框架。

为了提高性能,Laravel框架的某些组件与其他包进行了交换。在这里检查它们

我们可以考虑流明的示例场景

  • 您可能希望通过API向其他开发人员开放应用程序的某些功能。
  • 您的应用程序需要同时支持Web和移动应用程序,那么将数据存储在Lumen API包装的数据库中将是完美的。
  • 当您将可扩展性视为重点时,您可能需要流明

Laravel和Lumen之间的主要区别是,Laravel可以拥有Lumen所没有的Artisan命令。

Lumen这是一个微型框架,与Laravel具有相同的基础和许多相同的组件。

  • 但Lumen是为微服务而构建的,而不是为面向用户的应用程序而构建的。
  • 它是Laravel的大规模精简版本,因此它去掉了API不需要的功能,如HTTP会话和cookie,并且还限制了配置选项的数量。
  • Lumen使用了许多相同的组件,但将自举过程降至最低。
  • 它被设计成一个轻量级的API处理系统,因此您希望代码尽可能快地启动,并能够尽可能快地将数据返回给用户。

长话短说

  • 你有相同的路由管理和相同的MVC功能,你有中间件功能,包括节流,但像Eloquent这样的东西在默认情况下是关闭的,尽管有一个设置可以打开它-它不像是必须通过Composer添加的。
  • 你也不会得到像Tinker和Artisan命令这样的东西。

一些主要的区别

  • Laravel是一个全栈Web应用程序框架,它打包或支持许多第三方工具和框架,而Lumen是一个微框架,用于开发微服务和API开发,旨在提供速度和高响应时间。
  • Laravel需要对服务器进行不同类型的配置,以及与应用程序一起使用的其他工具,而Lumen Micro Framework是Laravel版本的轻量级形式,提供专门的功能,如API开发、Cookie、模板、缓存、日志记录、路由、HTTP会话等。
  • 与Lumen相比,Laravel可以集成更多数量的工具,而Lumen与其他工具的集成设施较少。
  • 与Laravel相比,Laravel在SQL查询和从应用程序级别调整数据库的情况下性能良好,而Lumen在SQL查询和较少功能的情况下性能下降。
  • 在卢蒙,如果你需要雄辩,你必须启用它。
  • 在Lumen中,您没有刀片模板引擎。
  • Laravel适合构建RESTful API(应用程序编程接口),而Lumen是构建微服务的性能最高的微框架API之一。
  • Lumen中的身份验证虽然使用与Laravel相同的底层库,但其配置与完整的Laravel框架完全不同。由于Lumen不支持会话状态,因此您希望进行身份验证的传入请求必须通过无状态机制(如API令牌)进行身份验证。
  • Lumen没有像Laravel那样的内置事件排队功能。

Laravel9.x内腔9.x

路由

基本的

特点 拉雷维尔 流明
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

重定向路由

特点 拉雷维尔 流明
基本的 Route::redirect($from, $to, $status); ns
普雷曼特 Route::permanentRedirect($from, $to); ns

查看路线

特点 拉雷维尔 流明
基本的 Route::view($from, $to); ns

路线参数

特点 拉雷维尔 流明
参数 ns ns
参数&;依赖注入 ns ns
所需参数 ns ns
所需参数 ns ns
正则表达式约束 ns ns
全局约束 ns ns

命名路由

特点 拉雷维尔 流明
基本的 Route::get($uri, $callback)->name('profile') $router->get($uri, ['as' => 'profile', $callback])
生成指向命名路由的URL route('profile') route('profile')
按名称检查当前路线 $request->route()->named('profile')布尔值 ns

路由组

特点 拉雷维尔 流明
中间件 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

路由模型绑定

特点 拉雷维尔 流明
隐式绑定 ns ns
隐式枚举绑定 ns ns
显式绑定 ns ns

备用路由

特点 拉雷维尔 流明
基本的 Route::fallback() ns

路由缓存

特点 拉雷维尔 流明
基本的 ns ns

中间件

特点 拉雷维尔 流明
定义中间件 artisan make:middleware 手动的
全球中间件 ns ns
将中间件分配给路由 ns ns
中间件组 ns ns
中间件参数 ns ns
可终止中间件 ns ns

CSRF保护

特点 拉雷维尔 流明
基本的 ns ns

由于流明版本5.2,CSRF已移除


控制器

特点 拉雷维尔 流明
定义控制器 artisan make:controller 手动的
基本的 ns ns
单动控制器 ns ns
控制器中间件 ns ns
资源控制器 ns ns
依赖注入&;控制器 ns ns

请求

特点 拉雷维尔 流明
访问请求 ns ns
请求路径&;方法 ns ns
请求标头 ns ns
请求IP地址 ns ns
内容协商 ns ns
PSR-7请求 ns ns
正在检索输入 ns ns
确定是否存在输入 ns ns
正在合并其他输入 ns ns
旧输入 ns ns
曲奇 ns ns
输入微调&;正常化 ns ns
正在检索上载的文件 ns ns
正在移动上载的文件 ns ns

回应

特点 拉雷维尔 流明
将标题附加到响应 ns ns
将Cookie附加到响应 ns ns
重定向 ns ns
查看响应 ns ns
JSON响应 ns ns
文件下载 ns ns
文件响应 ns ns

视图&;刀锋

特点 拉雷维尔 流明
基本的 ns ns
刀锋 ns ns

会话

特点 拉雷维尔 流明
基本的 ns ns

由于流明版本5.2,会话已删除


验证

特点 拉雷维尔 流明
基本的 ns ns
表单请求 ns ns
$this->validate方法 ns Lumen中可用的$this->validate帮助程序将始终返回带有相关错误消息的JSON响应。这与Laravel版本的方法形成对比,如果请求不是Ajax请求,Laravel版本的方法将返回重定向响应。由于流明是无状态的,并且不支持会话,因此不可能向会话闪烁错误。与Laravel不同的是,Lumen提供了从路径闭合中访问validate的方法。
existsunique规则 ns 如果要使用existsunique验证规则,则应在bootstrap/app.php文件中取消注释$app->withEloquent()方法调用。
$errors视图变量 ns Lumen不支持开箱即用的会话,因此在Laravel的每个视图中都可用的$errors视图变量在Lumen中不可用。如果验证失败,$this->validate帮助程序将抛出Illuminate\Validation\ValidationException,其中嵌入了包含所有相关错误消息的JSON响应。

错误&;伐木

特点 拉雷维尔 流明
错误 ns ns
伐木 ns ns

工匠控制台

特点 拉雷维尔 流明
正在运行命令 ns ns
正在写入命令 ns ns

缓存

特点 拉雷维尔 流明
基本的 ns ns

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

Redis支持

在使用带流明的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数据库配置。


编制资产

特点 拉雷维尔 流明
混合 ns ns

事件

特点 拉雷维尔 流明
基本的 ns ns
发电机

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

注册事件/侦听器

与完整的Laravel框架一样,流明应用程序附带的EventServiceProvider为注册所有事件侦听器提供了一个方便的位置。listen属性包含所有事件(键)及其侦听器(值)的数组。当然,您可以根据应用程序的需要向此数组添加任意数量的事件:

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

您可以使用event辅助函数或Event外观来激发整个流明应用程序中的事件。同样,这些函数的行为与完整的Laravel框架完全相同:

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

身份验证&;授权

特点 拉雷维尔 流明
身份验证 ns ns
授权 ns ns
身份验证

Lumen中的身份验证虽然使用与Laravel相同的底层库,但其配置与完整的Laravel框架完全不同。由于Lumen不支持会话状态,因此您希望进行身份验证的传入请求必须通过无状态机制(如API令牌)进行身份验证。

授权
定义能力

与Laravel相比,在Lumen中使用授权的主要区别在于如何定义能力。在流明中,您可以简单地使用AuthServiceProvider中的Gate Facade来定义能力:

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);
}

数据库

特点 拉雷维尔 流明
基本查询 ns ns
查询生成器 ns ns
雄辩的奥姆 ns ns
迁徙 ns ns
播种机 ns ns

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


电子邮件验证重置密码

特点 拉雷维尔 流明
电子邮件验证 ns ns
重置密码 ns ns

加密&;哈希

特点 拉雷维尔 流明
加密 ns ns
哈希 ns ns

应将.env文件的“APP_KEY ”选项设置为32个字符的随机字符串。如果未正确设置此值,则所有由流明加密的值都将是不安全的。


邮件

特点 拉雷维尔 流明
基本的 ns ns

队列

特点 拉雷维尔 流明
基本的 ns ns

Lumen不支持闭合作业。

发电机

流明不包括用于自动创建新作业类别的生成器。相反,您应该复制框架中包含的ExampleJob类。

调度作业

同样,您应该查阅完整的Laravel队列文档,以获得有关调度排队作业的完整信息。但是,就像在Laravel框架中一样,您可以使用dispatch功能从流明应用程序中的任何位置分派作业:

dispatch(new ExampleJob);

当然,您也可以使用Queue Facade.如果选择使用外观,请确保在bootstrap/app.php文件中取消注释对$app->withFacades()的调用:

Queue::push(new ExampleJob);

服务容器

特点 拉雷维尔 流明
基本的 ns ns
访问容器

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

正在解析实例

要解决容器之外的问题,您可以在已由容器自动解析的类上输入提示所需的依赖项,例如路由闭包、控制器构造函数、控制器方法、中间件、事件侦听器或排队作业。或者,您可以在应用程序中的任何位置使用app功能:

$instance = app(Something::class);

测试

特点 拉雷维尔 流明
基本的 ns ns