我阅读了文档,似乎 Lumen 是 Laravel 的功能较少。我肯定错过了什么。我正在寻找 Laravel 和 Lumen 的组件和功能的比较表。有谁知道区别?
8 回答
更新 (5.2)
在最新版本的 Lumen (5.2) 中,微框架专注于无状态 API。文档
_指出:
Lumen 5.2 代表了精简 Lumen 到只专注于服务无状态的 JSON API 的转变。因此,会话和视图不再包含在框架中。如果你需要访问这些功能,你应该使用完整的 Laravel 框架。
原始答案(<= 5.1)
流明就是速度。它比 Laravel 更快,每秒可以处理更多的请求。
Laravel 是一个将许多组件(第三方和 Laravel 自己的组件)粘合在一起的框架。现在 Lumen 使用了许多相同的组件,但将引导过程减少到最低限度。您可以说它是一种“不同的胶水”,组件(以及许多功能)大多相同。
通过在配置和更改默认启动过程方面消除框架的一些灵活性来实现性能改进。
除此之外,默认情况下会禁用更多功能,并且必须先激活它们才能使用。举个例子:Facades (like DB::table()
)
你首先需要取消注释这一行bootstrap/app.php
来启用它们:
// $app->withFacades();
Dotenv 环境文件和 Eloquent 也是如此。
对于路由,Lumen 使用nikic/FastRoute而不是 symfonys 路由器,因为它的性能要好得多,并且给微框架另一个很大的提升。
除此之外,几乎所有内容都与 Laravel 中的相同。
关于流明的好读物
- 文档(尤其是介绍)
- Matt Stauffer 的文章
- 采访 Taylor Otwell(尤其是最后一个问题)
- Reddit 讨论
- Laracast:引入流明
Lumen 并非旨在取代 Laravel,而是为微服务和 API 设计的更专业(和精简)的框架。它消除了 API 不需要的功能,例如 HTTP 会话和 cookie,并且还限制了配置选项的数量。开箱即用的 Lumen 牺牲了 Laravel 的灵活性来换取速度。
但是,您可以将 Laravel 组件添加到 Lumen 以对其进行扩展,因此它不仅可以用于微服务和 API。但是,如果您的目标是将 Lumen 扩展为一个网站,那么您不妨改用 Laravel。
它们也有不同的用例。Lumen 和 Laravel 旨在协同工作。对于频繁调用的 API 和服务,请使用 Lumen。对于面向用户的应用程序,请使用 Laravel。
这个答案取自我写的一篇博客文章,它解释了 Lumen 和 Laravel 之间的区别。
引用 Matt Stauffer 的话
Lumen 与 Laravel 具有相同的基础,以及许多相同的组件。但是 Lumen 是为微服务而构建的,而不是为面向用户的应用程序而构建的(尽管它可以用于任何事情。)因此,像 Bootstrap 和 Elixir 这样的前端细节以及身份验证引导程序和会话并不是开箱即用的,并且扩展和更改引导文件的灵活性较小。
你可以在这里阅读更多
Lumen 微框架是 Laravel 全栈框架的轻量级版本。Lumen 使用 Laravel 语法和组件,可以轻松“升级”到 Laravel。
Lumen 是专为微服务开发和 API 开发而设计的更专业(和精简)的框架。因此,Laravel 中的一些特性,如 HTTP 会话、cookie 和模板是不需要的,Lumen 将它们去掉,保留了必要的东西——路由、日志记录、缓存、队列、验证、错误处理和其他一些。
Laravel9.x
和流明9.x
路由
基本的
特征 | Laravel | 流明 |
---|---|---|
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) |
|
所有 HTTP 动词 | Route::any($uri, $callback) |
重定向路线
特征 | Laravel | 流明 |
---|---|---|
基本的 | Route::redirect($from, $to, $status); |
|
永久的 | Route::permanentRedirect($from, $to); |
查看路线
特征 | Laravel | 流明 |
---|---|---|
基本的 | Route::view($from, $to); |
路由参数
特征 | Laravel | 流明 |
---|---|---|
参数 | ||
参数和依赖注入 | ||
必需参数 | ||
必需参数 | ||
正则表达式约束 | ||
全局约束 |
命名路线
特征 | Laravel | 流明 |
---|---|---|
基本的 | Route::get($uri, $callback)->name('profile') |
$router->get($uri, ['as' => 'profile', $callback]) |
生成命名路由的 URL | route('profile') |
route('profile') |
按名称检查当前路由 | $request->route()->named('profile') 布尔值 |
路由组
特征 | Laravel | 流明 |
---|---|---|
中间件 | Route::middleware($middleware) |
$router->group(['middleware' => $middleware], $callback) |
控制器 | Route::controller(ProfileController::class) |
|
子域路由 | Route::domain('{account}.example.com') |
|
命名空间 | Route::namespace($namespace) |
$router->group(['namespace' => $namespace], $callback) |
路由前缀 | Route::prefix('admin') |
$router->group(['prefix' => 'admin'], $callback) |
路由名称前缀 | Route::name('admin.') |
路由模型绑定
特征 | Laravel | 流明 |
---|---|---|
隐式绑定 | ||
隐式枚举绑定 | ||
显式绑定 |
后备路线
特征 | Laravel | 流明 |
---|---|---|
基本的 | Route::fallback() |
路由缓存
特征 | Laravel | 流明 |
---|---|---|
基本的 |
中间件
特征 | Laravel | 流明 |
---|---|---|
定义中间件 | artisan make:middleware |
手动的 |
全局中间件 | ||
将中间件分配给路由 | ||
中间件组 | ||
中间件参数 | ||
可终止的中间件 |
CSRF 保护
特征 | Laravel | 流明 |
---|---|---|
基本的 |
自 Lumen 版本起移除 CSRF5.2
控制器
特征 | Laravel | 流明 |
---|---|---|
定义控制器 | artisan make:controller |
手动的 |
基本的 | ||
单动作控制器 | ||
控制器中间件 | ||
资源控制器 | ||
依赖注入和控制器 |
要求
特征 | Laravel | 流明 |
---|---|---|
访问请求 | ||
请求路径和方法 | ||
请求标头 | ||
请求 IP 地址 | ||
内容协商 | ||
PSR-7 请求 | ||
检索输入 | ||
确定输入是否存在 | ||
合并附加输入 | ||
旧输入 | ||
饼干 | ||
输入修整和归一化 | ||
检索上传的文件 | ||
移动上传的文件 |
回复
特征 | Laravel | 流明 |
---|---|---|
将标题附加到响应 | ||
将 Cookie 附加到响应 | ||
重定向 | ||
查看回复 | ||
JSON 响应 | ||
文件下载 | ||
文件响应 |
视图和刀片
特征 | Laravel | 流明 |
---|---|---|
基本的 | ||
刀 |
会议
特征 | Laravel | 流明 |
---|---|---|
基本的 |
自 Lumen 版本以来已删除会话5.2
验证
特征 | Laravel | 流明 |
---|---|---|
基本的 | ||
表单请求 | ||
$this->validate 方法_ |
Lumen 中可用的$this->validate 帮助程序将始终返回带有相关错误消息的 JSON 响应。这与 Laravel 版本的方法相反,如果请求不是 AJAX 请求,它将返回重定向响应。由于 Lumen 是无状态的并且不支持会话,因此不可能向会话闪烁错误。validate 与 Laravel 不同,Lumen 提供了从 Route 闭包中访问该方法的功能。 |
|
exists 和unique 规则_ |
如果您想使用exists orunique 验证规则,您应该取消注释文件中的$app->withEloquent() 方法调用bootstrap/app.php 。 |
|
视图$errors 变量 |
Lumen 不支持开箱即用的会话,因此$errors Laravel 中每个视图中可用的视图变量在 Lumen 中不可用。如果验证失败,$this->validate 帮助程序将抛出Illuminate\Validation\ValidationException 包含所有相关错误消息的嵌入式 JSON 响应。 |
错误和日志
特征 | Laravel | 流明 |
---|---|---|
错误 | ||
日志记录 |
工匠控制台
特征 | Laravel | 流明 |
---|---|---|
运行命令 | ||
编写命令 |
缓存
特征 | Laravel | 流明 |
---|---|---|
基本的 |
在使用Cache
外观之前,请确保您已取消注释文件中的$app->withFacades()
方法调用bootstrap/app.php
。
Redis 支持
在将 Redis 缓存与 Lumen 一起使用之前,您需要illuminate/redis
通过 Composer 安装包。然后,您应该Illuminate\Redis\RedisServiceProvider
在bootstrap/app.php
文件中注册:
$app->register(Illuminate\Redis\RedisServiceProvider::class);
$app->withEloquent()
如果您尚未调用bootstrap/app.php
文件,则应调用文件$app->configure('database');
以bootstrap/app.php
确保正确加载 Redis 数据库配置。
编译资产
特征 | Laravel | 流明 |
---|---|---|
混合 |
活动
特征 | Laravel | 流明 |
---|---|---|
基本的 |
发电机
在 Lumen 中,没有生成器命令可以为您生成事件和侦听器,因此您应该简单地复制ExampleEvent
orExampleListener
类来定义您自己的事件和侦听器。这些示例类提供了每个事件和侦听器的基本结构。
注册事件/监听器
与完整的 Laravel 框架一样,EventServiceProvider
包含在 Lumen 应用程序中的 提供了一个方便的位置来注册所有事件侦听器。该listen
属性包含所有事件(键)及其侦听器(值)的数组。当然,您可以根据应用程序的需要向该数组添加任意数量的事件:
protected $listen = [
'App\Events\ExampleEvent' => [
'App\Listeners\ExampleListener',
],
];
射击事件
您可以使用event
辅助函数或Event
外观在整个 Lumen 应用程序中触发事件。同样,这些函数的行为与完整的 Laravel 框架等效:
event(new ExampleEvent);
Event::dispatch(new ExampleEvent);
认证与授权
特征 | Laravel | 流明 |
---|---|---|
验证 | ||
授权 |
验证
Lumen 中的身份验证虽然使用与 Laravel 相同的底层库,但配置与完整的 Laravel 框架完全不同。由于 Lumen 不支持会话状态,因此您希望验证的传入请求必须通过 API 令牌等无状态机制进行验证。
授权
定义能力
与 Laravel 相比,在 Lumen 中使用授权的主要区别在于如何定义能力。在 Lumen 中,您可以简单地使用Gate
外观AuthServiceProvider
来定义能力:
Gate::define('update-post', function ($user, $post) {
return $user->id === $post->user_id;
});
定义策略
与 Laravel 不同,Lumen$policies
的AuthServiceProvider
. 但是,您仍然可以从提供者的方法中调用外观policy
上的方法:Gate
boot
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 | 流明 |
---|---|---|
基本查询 | ||
查询生成器 | ||
雄辩的 ORM | ||
迁移 | ||
播种机 |
如果您想使用DB
外观,您应该取消注释文件中的$app->withFacades()
调用bootstrap/app.php
。
电子邮件验证和重置密码
特征 | Laravel | 流明 |
---|---|---|
电子邮件验证 | ||
重置密码 |
加密和散列
特征 | Laravel | 流明 |
---|---|---|
加密 | ||
散列 |
您应该将文件的APP_KEY
选项设置.env
为 32 个字符的随机字符串。如果这个值没有正确设置,所有被 Lumen 加密的值都是不安全的。
邮件
特征 | Laravel | 流明 |
---|---|---|
基本的 |
队列
特征 | Laravel | 流明 |
---|---|---|
基本的 |
Lumen 不支持关闭作业。
发电机
Lumen 不包括用于自动创建新作业类的生成器。相反,您应该复制ExampleJob
框架中包含的类。
派遣工作
同样,您应该查阅完整的 Laravel 队列文档以获取有关调度队列作业的完整信息;但是,就像在 Laravel 框架中一样,您可以使用该dispatch
函数从 Lumen 应用程序中的任何位置调度作业:
dispatch(new ExampleJob);
当然,你也可以使用Queue
门面。如果您选择使用外观,请务必取消注释文件中的$app->withFacades()
调用bootstrap/app.php
:
Queue::push(new ExampleJob);
服务容器
特征 | Laravel | 流明 |
---|---|---|
基本的 |
访问容器
该Laravel\Lumen\Application
实例是 的扩展Illuminate\Container\Container
,因此可以将其视为您的应用程序的服务容器。
解析实例
要从容器中解决问题,您可以对已由容器自动解析的类(例如路由闭包、控制器构造函数、控制器方法、中间件、事件侦听器或排队作业)进行类型提示所需的依赖项. 或者,您可以app
在应用程序的任何位置使用该函数:
$instance = app(Something::class);
测试
特征 | Laravel | 流明 |
---|---|---|
基本的 |
Lumen 是一个微框架,与 Laravel 具有相同的基础,并且有许多相同的组件。
- 但是 Lumen 是为微服务而构建的,而不是面向用户的应用程序。
- 它是 Laravel 的大规模精简版本,因此它去掉了 API 不需要的功能,例如 HTTP 会话和 cookie,并且还限制了配置选项的数量。
- Lumen 使用了许多相同的组件,但将引导过程减少到最低限度。
- 它被设计成一个轻量级的 API 处理系统,因此您希望代码尽快启动并能够尽快将数据返回给用户。
为了缩短
- 您拥有相同的路由管理和相同的 MVC 功能,您拥有包括节流在内的中间件功能,但是像 Eloquent 这样的东西默认情况下是关闭的,尽管有一个设置可以打开它——它不像它必须通过作曲家添加例如.
- 此外,您不会得到诸如添加修补程序和工匠命令之类的东西。
一些主要区别
- Laravel 是一个全栈 Web 应用程序框架,它封装或支持许多第三方工具和框架,而 Lumen 是一个微框架,用于开发微服务和 API 开发,旨在提供速度和高响应时间。
- Laravel 需要不同类型的服务器配置,以及与应用程序一起使用的其他工具,而 Lumen 微框架是 Laravel 版本的轻量级形式,提供 API 开发、cookie、模板、缓存、日志记录、路由等特殊功能, HTTP 会话等。
- 与 Lumen 相比,Laravel 可以与更多数量的工具集成,而 Lumen 与其他工具的集成设施更少。
- Laravel 在 SQL 查询和从应用程序级别调优数据库的情况下性能会很好,而 Lumen 在 SQL 查询和功能较少的情况下性能下降。与 Laravel 相比。
- 在 Lumen 中,如果你需要 Eloquent,你必须启用它。
- 在 Lumen 中,您没有 Blade 模板引擎。
- Laravel 非常适合构建 RESTful API(应用程序编程接口),而 Lumen 是用于构建微服务的性能最高的微框架 API 之一。
- Lumen 中的身份验证虽然使用与 Laravel 相同的底层库,但配置与完整的 Laravel 框架完全不同。由于 Lumen 不支持会话状态,因此您希望验证的传入请求必须通过 API 令牌等无状态机制进行验证。
- Lumen 没有 Laravel 的内置事件队列功能。
为什么是流明?
Lumen 是构建基于 Laravel 的微服务和极速 API 的完美解决方案。事实上,它是可用的最快的微框架之一。编写速度惊人的服务来支持您的 Laravel 应用程序从未如此简单。文档
Lumen 是一个构建 API 的框架,它本质上将为您的请求提供 JSON 响应。而已。
这些类型的应用程序通常称为 Web 服务。
从 Lumen 5.2 更新开始,它不支持 laravel 视图、会话等……因为你必须升级到完整的 laravel 框架。
Laravel 框架的某些组件与其他包交换以提高性能。在这里检查它们
我们可以考虑流明的示例场景
- 您可能希望通过 API 向其他开发人员开放应用程序的某些功能
- 您的应用程序需要同时支持 Web 和移动应用程序,那么将数据存储在封装在 Lumen API 的数据库中将是完美的选择。
- 当您将可扩展性视为重要点时,您可能需要流明
laravel 和 lumen 的主要区别在于,Laravel 可以有 artisan 命令,而 lumen 没有。