流明与 Laravel 之间的异同

Differences and Similarities Between Lumen and Laravel

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

引自马特·斯托弗

Lumen has the same foundation as Laravel, and many of the same components. But Lumen is built for microservices, not so much for user-facing applications (although it can be used for anything.) As such, frontend niceties like Bootstrap and Elixir and the authentication bootstrap and sessions don't come enabled out of the box, and there's less flexibility for extending and changing the bootstrap files.

你可以阅读更多here

更新 (5.2)

在最新版本的 Lumen (5.2) 中,微框架专注于无状态 API。
documentation 状态:

Lumen 5.2 represents a shift on slimming Lumen to focus solely on serving stateless, JSON APIs. As such, sessions and views are no longer included with the framework. If you need access to these features, you should use the full Laravel framework.


原始答案 (<= 5.1)

流明就是速度。它比 Laravel.

更快,每秒可以处理更多的请求

Laravel 是一个将许多组件(第 3 方和 Laravel 自己的组件)粘合在一起的框架。现在 Lumen 使用了很多相同的组件,但将引导过程精简到了最低限度。你可以说它是一种“不同的胶水”,组件(因此很多功能)基本相同。

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

除此之外,更多功能默认禁用,必须激活才能使用。例如:Facades(如 DB::table()
您首先需要取消注释 bootstrap/app.php 中的这一行以启用它们:

// $app->withFacades();

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

对于路由,Lumen 使用 nikic/FastRoute 而不是 symfonys 路由器,因为它的性能要好得多,并且给微框架带来了另一个巨大的提升。

除此之外,几乎所有内容都与 Laravel 中的相同。

关于 Lumen 的好文章

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

但是,您可以向 Lumen 添加 Laravel 组件来扩展它,因此它 可以 不仅仅用于微服务,而且 API .但是,如果您的目标是将 Lumen 扩展为一个网站,您不妨使用 Laravel。

它们也有不同的用例。 Lumen 和 Laravel 旨在协同工作。对于 APIs 和服务被频繁调用,请使用 Lumen。对于面向用户的应用程序,请使用 Laravel.


这个答案摘自我写的一篇 blog post,解释了 Lumen 和 Laravel 之间的区别。

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

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

为什么是流明?

Lumen is the perfect solution for building Laravel based micro-services and blazing fast APIs. In fact, it's one of the fastest micro-frameworks available. It has never been easier to write stunningly fast services to support your Laravel applications. Doc

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

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

自 Lumen 5.2 更新起,它不支持 laravel 视图、会话等...为此您必须升级到完整的 laravel 框架。

Laravel 框架的一些组件与其他包交换以提高性能。 check them here

我们可以考虑 Lumen 的示例场景

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

laravel 和 lumen 的主要区别在于,Laravel 可以有 artisan 命令,而 lumen 没有。

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

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

简而言之

  • 你有相同的路由管理和相同的 MVC 功能,你有包括节流在内的中间件功能,但是 Eloquent 之类的东西在默认情况下是关闭的,尽管有一个设置可以打开它 - 它不像例如,它必须通过作曲家添加。
  • 此外,您不会添加 tinker 和 artisan 命令等内容。

一些主要区别

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

Laravel 9.x and Lumen 9.x

路由选择

基本

Features 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)
Multiple HTTP verbs Route::match($types, $uri, $callback)
All HTTP verbs Route::any($uri, $callback)

重定向路由

Features Laravel Lumen
Basic Route::redirect($from, $to, $status);
Premanent Route::permanentRedirect($from, $to);

查看路线

Features Laravel Lumen
Basic Route::view($from, $to);

路由参数

Features Laravel Lumen
Parameters
Parameters & Dependency Injection
Required Parameters
Required Parameters
Regular Expression Constraints
Global Constraints

命名路由

Features Laravel Lumen
Basic Route::get($uri, $callback)->name('profile') $router->get($uri, ['as' => 'profile', $callback])
Generating URLs To Named Routes route('profile') route('profile')
Inspecting The Current Route by Name $request->route()->named('profile') boolean

路由组

Features Laravel Lumen
Middleware Route::middleware($middleware) $router->group(['middleware' => $middleware], $callback)
Controllers Route::controller(ProfileController::class)
Subdomain Routing Route::domain('{account}.example.com')
Namespaces Route::namespace($namespace) $router->group(['namespace' => $namespace], $callback)
Route Prefixes Route::prefix('admin') $router->group(['prefix' => 'admin'], $callback)
Route Name Prefixes Route::name('admin.')

路由模型绑定

Features Laravel Lumen
Implicit Binding
Implicit Enum Binding
Explicit Binding

后备路线

Features Laravel Lumen
Basic Route::fallback()

路由缓存

Features Laravel Lumen
Basic

中间件

Features Laravel Lumen
Defining Middleware artisan make:middleware Manual
Global Middleware
Assigning Middleware To Routes
Middleware Groups
Middleware Parameters
Terminable Middleware

CSRF 保护

Features Laravel Lumen
Basic

自 Lumen 版本 5.2

后删除了 CSRF

控制器

Features Laravel Lumen
Defining Controller artisan make:controller Manual
Basic
Single Action Controllers
Controller Middleware
Resource Controllers
Dependency Injection & Controllers

请求

Features Laravel Lumen
Accessing The Request
Request Path & Method
Request Headers
Request IP Address
Content Negotiation
PSR-7 Requests
Retrieving Input
Determining If Input Is Present
Merging Additional Input
Old Input
Cookies
Input Trimming & Normalization
Retrieving Uploaded Files
Moving Uploaded Files

回应

Features Laravel Lumen
Attaching Headers To Responses
Attaching Cookies To Responses
Redirects
View Responses
JSON Responses
File Downloads
File Responses

观看次数和 Blade

Features Laravel Lumen
Basic
Blade

Session

Features Laravel Lumen
Basic

Session 自 Lumen 版本 5.2

后删除

验证

Features Laravel Lumen
Basic
Form Requests
The $this->validate Method The $this->validate helper which is available in Lumen will always return a JSON response with the relevant error messages. This is in contrast to the Laravel version of the method which will return a redirect response if the request is not an AJAX request. Since Lumen is stateless and does not support sessions, flashing errors to the session is not a possibility. Unlike Laravel, Lumen provides access to the validate method from within Route closures.
The exists And unique Rules If you would like to use the exists or unique validation rules, you should uncomment the $app->withEloquent() method call in your bootstrap/app.php file.
The $errors View Variable Lumen does not support sessions out of the box, so the $errors view variable that is available in every view in Laravel is not available in Lumen. Should validation fail, the $this->validate helper will throw Illuminate\Validation\ValidationException with embedded JSON response that includes all relevant error messages.

错误和日志记录

Features Laravel Lumen
Error
Logging

Artisan 控制台

Features Laravel Lumen
Running Commands
Writing Commands

缓存

Features Laravel Lumen
Basic

在使用 Cache facade 之前,请确保您已取消注释 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数据库配置已正确加载。


编译资产

Features Laravel Lumen
Mix

事件

Features Laravel Lumen
Basic
发电机

在 Lumen 中,没有生成器命令来为你生成事件和监听器,所以你应该简单地复制 ExampleEventExampleListener classes 来定义你自己的事件和听众。这些示例 classes 提供了每个事件和侦听器的基本结构。

正在注册事件/监听器

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

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

您可以使用 event 辅助函数或 Event facade 在整个 Lumen 应用程序中触发事件。同样,这些函数的行为与它们的完整 Laravel 框架等效项完全相同:

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

身份验证与授权

Features Laravel Lumen
Authentication
Authorization
身份验证

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

授权
定义能力

与 Laravel 相比,在 Lumen 中使用授权的主要区别在于能力的定义方式。在 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);
}

数据库

Features Laravel Lumen
Basic Queries
Query Builder
Eloquent ORM
Migrations
Seeders

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


电子邮件验证和重置密码

Features Laravel Lumen
Email Verification
Resetting Passwords

加密和散列

Features Laravel Lumen
Encryption
Hashing

您应该将 .env 文件的 APP_KEY 选项设置为 32 个字符的随机字符串。如果这个值设置不当,所有被Lumen加密的值都是不安全的。


邮件

Features Laravel Lumen
Basic

队列

Features Laravel Lumen
Basic

不支持关闭作业由 Lumen 提供。

发电机

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

调度作业

同样,您应该查阅完整的 Laravel 队列文档以获取有关调度排队作业的完整信息;然而,就像在 Laravel 框架中一样,您可以使用 dispatch 函数从您的 Lumen 应用程序中的任何地方调度作业:

dispatch(new ExampleJob);

当然,你也可以使用Queue门面。如果您选择使用外观,请务必取消注释 bootstrap/app.php 文件中对 $app->withFacades() 的调用:

Queue::push(new ExampleJob);

服务容器

Features Laravel Lumen
Basic
访问容器

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

解决实例

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

$instance = app(Something::class);

测试

Features Laravel Lumen
Basic