【问题标题】:Differences and Similarities Between Lumen and LaravelLumen 和 Laravel 的异同
【发布时间】:2015-06-21 06:43:24
【问题描述】:

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

【问题讨论】:

标签: php laravel lumen


【解决方案1】:

引用马特·斯托弗的名言

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

您可以阅读更多here

【讨论】:

  • 另外,Lumen 不使用 Symfony 的 Routing 组件。相反,nikic/fast-route 用于提高性能。
  • Matt Stauffer 为 Laravel 提供的 bower setup 无论如何都违背了 Laravel 中默认 Bootstrap UI 的目的,而对于 Elixir,这是一个 npm install,所以它还没有完全准备好“出类拔萃”盒子”我会说。因此,通过切换到 Lumen,我们在这些方面并没有损失太多。在 Lumen 中,我只需创建一个 package.json 和 npm install Elixer,然后设置 bower 并完成...
  • 但是,在使用 Lumen 之后,我可以告诉你有一些挫折。到目前为止,我发现与 Laravel 提供的相比,许多请求/路由/帮助程序是不完整的。例如,您不能执行redirect()->intended。我希望 Lumen 能够在这些领域赶上。我真的很喜欢没有 ORM(Eloquent)的 Laravel,所以 Lumen 对我很有吸引力。
  • @prograhammer,我认为 Lumen 中永远不会包含该特定功能。我认为这需要 Lumen 有意取消的会话。此外,我认为 redirect()->intended() 与 API 并没有多大用处,而这正是 Lumen 所关注的。
  • Lumen 用于 APIS 而不是前端
【解决方案2】:

更新 (5.2)

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

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


原始答案(

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

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

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

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

// $app->withFacades();

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

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

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

关于 Lumen 的好读物

【讨论】:

  • 如果我们开始取消注释以恢复功能,会不会那么快?
  • @SamDark 显然,您启用的每个功能都会变慢一些。但它仍然会很快,因为禁用的功能只是性能优化的一部分
  • 因此基准测试不会反映实际应用程序的开销,而在实际应用程序中它会更高。好的。
  • @SamDark This blog post 解释了它是如何进行基准测试的。正如您所看到的,测试应用程序只是返回“Hello World”而不使用模型或其他框架功能,因此实际应用程序中的性能会变慢(尽管在大多数情况下并不明显。您的应用程序仍然会快得离谱)
  • @lukasgeiter 因此,据我所知,如果我正在使用 RESTful Laravel API 构建 Ionic 应用程序,那么使用 Lumen 会更有意义吗?
【解决方案3】:

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

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

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


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

【讨论】:

  • 据我所知,cookie、会话等仍然存在。但是它们会被延迟加载,并且只会在使用时真正影响性能。
  • Lumen 现在是我的首选框架。我不使用 Eloquent(或任何 ORM),所以 Lumen 非常适合我。
  • 假设我正在构建一个 Web 应用程序并决定编写一个 API 以进一步分离逻辑(并轻松允许第三方应用程序)。用 Lumen 编写 API 并用 Laravel 编写网站是一种好习惯吗?
  • 是替代品。这是带有不同路由器的 Laravel。几乎没有任何东西被剥离 - 只是成为可选的。当据称更快的 Laravel(流明)可用时,没有正当理由使用 Laravel。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    为什么选择 Lumen?

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

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

    这类应用程序通常称为网络服务

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

    为了提高性能,Laravel 框架的某些组件与其他包交换。 check them here

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 这不是真的,或者至少不是最新的。我对旧版本不太了解,但我安装了 lumen 7.x 并且我有工匠命令
      【解决方案7】:

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

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

      简而言之

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

      一些主要区别

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

      【讨论】:

        【解决方案8】:

        Laravel 9.xLumen 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.2987654545@

        后删除了 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

        视图和刀片

        Features Laravel Lumen
        Basic
        Blade

        会话

        Features Laravel Lumen
        Basic

        自 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

        工匠控制台

        Features Laravel Lumen
        Running Commands
        Writing Commands

        缓存

        Features Laravel Lumen
        Basic

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


        编译资产

        Features Laravel Lumen
        Mix

        活动

        Features Laravel Lumen
        Basic
        发电机

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

        认证与授权

        Features Laravel Lumen
        Authentication
        Authorization
        认证

        Lumen 中的身份验证虽然使用与 Laravel 相同的底层库,但其配置与完整的 Laravel 框架完全不同。由于 Lumen 不支持会话状态,因此您希望验证的传入请求必须通过 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 外观,你应该在你的 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 不包含用于自动创建新作业类的生成器。相反,您应该复制框架中包含的 ExampleJob 类。

        派遣工作

        同样,您应该查阅完整的 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 的扩展,因此它可以被视为您的应用程序的服务容器。

        解析实例

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

        $instance = app(Something::class);
        

        测试

        Features Laravel Lumen
        Basic

        【讨论】:

          猜你喜欢
          • 2018-06-28
          • 2015-07-06
          • 2017-06-22
          • 2017-08-16
          • 2017-09-30
          • 2021-07-26
          • 2015-06-26
          • 2016-09-21
          • 2021-08-16
          相关资源
          最近更新 更多