我读了文档,看起来Lumen是更少功能的Laravel。我可能漏掉了什么。 我正在寻找一个比较表格,比较Laravel和Lumen的组件和功能。有人知道它们之间的区别吗?
我读了文档,看起来Lumen是更少功能的Laravel。我可能漏掉了什么。 我正在寻找一个比较表格,比较Laravel和Lumen的组件和功能。有人知道它们之间的区别吗?
最新版本的Lumen(5.2)专注于无状态API。文档指出:
Lumen 5.2将精简Lumen,专注于仅提供无状态JSON API。因此,会话和视图不再包含在框架中。如果您需要访问这些功能,则应使用完整的Laravel框架。
Lumen 的核心是速度。它比 Laravel 更快,可以处理更多的请求。
Laravel 是一个框架,将许多组件(第三方和 Laravel 自己的组件)粘合在一起。现在 Lumen 使用了许多相同的组件,但是将引导过程简化到最小。你可以说它是“不同的胶水”,这些组件(因此很多功能)大部分都是相同的。
通过减少框架的灵活性,以及改变默认的启动过程,实现了性能的提高。
除此之外,默认情况下禁用了更多的功能,必须在使用之前激活。例如:Facades(如 DB::table()
)
你需要先取消注释 bootstrap/app.php
中的这行代码才能启用它们:
// $app->withFacades();
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这样的前端套件以及身份验证和会话启动文件不会在开箱即用时启用,并且扩展和更改启动文件的灵活性较小。
您可以在这里阅读更多信息。
redirect()->intended
。我希望Lumen在这些领域能够赶上。我真的很喜欢没有ORM(Eloquent)的Laravel,所以Lumen对我非常有吸引力。 - prograhammerredirect()->intended()
有太多用处,而这正是Lumen关注的重点。 - Tyler Crompton9.x
和Lumen 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) |
|
所有HTTP动词 | Route::any($uri, $callback) |
特性 | Laravel | Lumen |
---|---|---|
基础功能 | Route::redirect($from, $to, $status); |
|
永久重定向 | Route::permanentRedirect($from, $to); |
特性 | Laravel | Lumen |
---|---|---|
基础功能 | Route::view($from, $to); |
功能 | Laravel | Lumen |
---|---|---|
参数 | ||
参数和依赖注入 | ||
必填参数 | ||
正则表达式限制 | ||
全局约束 |
功能 | Laravel | Lumen |
---|---|---|
基本使用 | Route::get($uri, $callback)->name('profile') |
$router->get($uri, ['as' => 'profile', $callback]) |
生成命名路由的URL | route('profile') |
route('profile') |
通过名称检查当前路由 | $request->route()->named('profile') 布尔值 |
特点 | Laravel | Lumen |
---|---|---|
中间件 | 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 | Lumen |
---|---|---|
隐式绑定 | ||
隐式枚举绑定 | ||
显式绑定 |
特性 | Laravel | Lumen |
---|---|---|
基础 | Route::fallback() |
特性 | Laravel | Lumen |
---|---|---|
基础 |
特性 | Laravel | Lumen |
---|---|---|
定义中间件 | artisan make:middleware |
手动 |
全局中间件 | ||
分配中间件到路由 | ||
中间件组 | ||
中间件参数 | ||
可终止的中间件 |
特性 | Laravel | Lumen |
---|---|---|
基本 |
自 Lumen 版本 5.2
起,已删除 CSRF(跨站点请求伪造)功能。
特性 | Laravel | Lumen |
---|---|---|
定义控制器 | artisan make:controller |
手动 |
基本 | ||
单动作控制器 | ||
控制器中间件 | ||
资源控制器 | ||
依赖注入与控制器 |
功能 | Laravel | Lumen |
---|---|---|
访问请求 | ||
请求路径和方法 | ||
请求头 | ||
请求IP地址 | ||
内容协商 | ||
PSR-7请求 | ||
检索输入 | ||
确定是否存在输入 | ||
合并额外的输入 | ||
旧的输入 | ||
Cookies | ||
输入修剪和规范化 | ||
检索上传的文件 | ||
移动上传的文件 |
特性 | Laravel | Lumen |
---|---|---|
将标头附加到响应 | ||
将cookie附加到响应 | ||
重定向 | ||
查看响应 | ||
JSON响应 | ||
文件下载 | ||
文件响应 |
特性 | Laravel | Lumen |
---|---|---|
基本 | ||
Blade模板引擎 |
功能 | Laravel | Lumen |
---|---|---|
基本 |
自 Lumen 版本5.2
开始,已删除会话(Session)功能。
特点 | Laravel | Lumen |
---|---|---|
基本功能 | ||
表单请求 | ||
$this->validate 方法 |
Lumen中可用的$this->validate 助手将始终返回带有相关错误消息的JSON响应。与Laravel版本的该方法相比,如果请求不是AJAX请求,则会返回重定向响应。由于Lumen是无状态的且不支持会话,因此闪存错误到会话不可能。与Laravel不同,Lumen提供了在路由闭包内访问 validate 方法的方式。 |
|
exists 和unique 规则 |
如果要使用exists 或unique 验证规则,则应取消注释bootstrap/app.php 文件中的$app->withEloquent() 方法调用。 |
|
$errors 视图变量 |
Lumen不支持会话,因此在Lumen中不可用每个视图中都可用的$errors 视图变量。如果验证失败,则$this->validate 助手将抛出Illuminate\Validation\ValidationException ,并嵌入了包含所有相关错误消息的JSON响应。 |
特点 | Laravel | Lumen |
---|---|---|
错误处理 | ||
日志记录 |
特点 | Laravel | Lumen |
---|---|---|
运行命令 | ||
编写命令 |
特点 | Laravel | Lumen |
---|---|---|
基本 |
在使用Cache
门面之前,请确保您已经取消注释了bootstrap/app.php
文件中的$app->withFacades()
方法调用。
在使用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 |
特性 | Laravel | Lumen |
---|---|---|
基本 |
Lumen中没有生成器命令为您生成事件和侦听器,因此您只需复制ExampleEvent
或ExampleListener
类来定义自己的事件和侦听器。这些示例类提供了每个事件和侦听器的基本结构。
与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 |
---|---|---|
认证 | ||
授权 |
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 |
---|---|---|
基本查询 | ||
查询构造器 | ||
Eloquent ORM | ||
迁移 | ||
种子 |
如果您想要使用DB
外观,应取消注释bootstrap/app.php
文件中的$app->withFacades()
调用。
特点 | Laravel | Lumen |
---|---|---|
邮件验证 | ||
密码重置 |
特性 | Laravel | Lumen |
---|---|---|
加密 | ||
哈希 |
你需要将.env
文件中的APP_KEY
设置为一个32位随机字符串。如果这个值没有被正确设置,Lumen进行的所有加密都将不安全。
特性 | Laravel | Lumen |
---|---|---|
基础 |
特性 | Laravel | Lumen |
---|---|---|
基础 |
Lumen不支持闭包作业。
Lumen不包括自动创建新作业类的生成器。相反,你应该复制框架中包含的ExampleJob
类。
同样,你应该查阅完整的Laravel队列文档以了解有关分派队列作业的完整信息。然而,就像在Laravel框架中一样,你可以使用dispatch
函数从Lumen应用程序中的任何位置分派作业:
dispatch(new ExampleJob);
当然,您也可以使用 Queue
门面(facade)。如果选择使用门面,请确保在您的 bootstrap/app.php
文件中取消注释调用 $app->withFacades()
的代码:
Queue::push(new ExampleJob);
特性 | Laravel | Lumen |
---|---|---|
基本 |
Laravel\Lumen\Application
实例是 Illuminate\Container\Container
的扩展,因此它可以作为应用程序的服务容器。
要从容器中解析出东西,您可以在已由容器自动解析的类(例如路由闭包、控制器构造函数、控制器方法、中间件、事件监听器或排队作业)上对需要的依赖项进行类型提示。或者,您可以在应用程序的任何地方使用 app
函数:
$instance = app(Something::class);
特性 | Laravel | Lumen |
---|---|---|
基础功能 |
Lumen微框架是Laravel全栈框架的轻量化版本。Lumen使用Laravel语法和组件,并且可以轻松地升级到Laravel。
Lumen是一种更专业(和精简)的框架,专门用于微服务开发和API开发。因此,Laravel中的某些功能,例如HTTP会话、cookie和模板不需要,Lumen将它们移除,只保留必要的内容:路由、日志、缓存、队列、验证、错误处理等等。
为什么选择 Lumen?
Lumen 是构建基于 Laravel 的微服务和极速 API 的完美解决方案。实际上,它是最快的微框架之一。编写支持 Laravel 应用程序的惊人快速服务从未如此简单。文档
Lumen 是一个构建 API 的框架,它将为您的请求提供 JSON 响应。就是这样。
这些类型的应用程序通常被称为 Web 服务。
截至 Lumen 5.2 更新,它不支持 Laravel 视图、会话等功能...如果需要这些功能,您将需要升级到完整的 Laravel 框架。
某些 Laravel 框架组件已被其他包替换以提高性能。在这里查看它们
可以考虑使用 Lumen 的示例场景
Laravel和Lumen之间的主要区别在于,Laravel可以使用Artisan命令,而Lumen则不支持。