编程

Laravel 11: 深入了解精简的目录结构

469 2024-02-05 01:33:00

我想你会喜欢下周推出的 Laravel 11 应用程序中的新框架!新人会欣赏极简主义,有经验的开发人员升级不会喷到破坏性的变化。你不必更改Laravel 10 应用结构即可升级到 Laravel 11。

如果你想跟随并进行实验,你可以同时创建一个 Laravel 10 和 Laravel 11 项目。我们使用以下命令来执行此操作

# Update the installer
composer global update laravel/installer -W
 
cd path/to/projects
 
# Create a Laravel 10 app
laravel new laravel-10-app -n --git --pest
 
# Crate a Laravel 11 app
laravel new laravel-11-app --dev -n --git --pest

表面上看,项目目录结构看起来是一样的:

不过,如果你深入到子目录,全新安装的 Laravel 11 文件数量减少了 69 个文件:

# Fresh Laravel v10 app
$ find . -type f -not -path "./vendor/*" | wc -l
=> 217
 
# Fresh Laravel v11 app (as of 01/29/2024)
$ find . -type f -not -path "./vendor/*" | wc -l
=> 148

让我们回顾一下最重要的更新,看看它与 Laravel 10 应用相比如何,这样你就可以为新的 Laravel 11应用的变化做好准备。

app 目录

app 目录已经大幅精简,将 Laravel 附带的九个中间件移入框架并移出项目。通常,这些中间件不是高度定制的,Laravel 11 将提供其他方法来自定义内置中间件以及添加你自己的中间件。

The app directory in a fresh Laravel 11 app

中间件的更改是通过 bootstrap/app.php 文件完成的,根据T aylor Otwell 的说法,该文件是一个“用于配置 Laravel 的精简路由风格文件”,如下所示:

return Application::configure(basePath: dirname(__DIR__))
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        // api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        // channels: __DIR__.'/../routes/channels.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

你可以像如下在 withMiddleware() 闭包中添加应用中间件:

$middleware->web(append: \App\Http\Middleware\ExampleMiddleware::class);

Laravel 项目中不再有 Kernel.php 文件,这些是通过框架的 bootstrap/app.php 文件处理。你可能也注意到了 Controllers 目录只有一个没有继承任何类的 Controller 类。由你来决定是否继承控制器,不过它提供了默认的抽象 Controller 类。

config 目录

最令你震惊的可能是 config 目录的更新,其中没有任何文件(除了 .gitkeep 文件)。不过,你也会注意到 .env.example 文件中有更多的配置项。

如果你想从框架中发布任何指定配置文件,并对其自定义,可以使用 config:publish 命令:

# config/database.php
php artisan config:publish database
 
# config/logging.php
php artisan config:publish logging
 
# Or publish all of them
php artisan config:publish

你可以自由地只扩展你关心的配置项,它们将与框架的默认值合并,这样你就不必将所有发布的配置选项都保存在给定的文件中。

假设你想在框架附带的配置中查找配置值。在这种情况下,可以使用Artisan config:show 命令,发布配置,或在 Laravel vendor 文件夹中的config/logging.php 文件中查找:

php artisan config:show logging
 
cat vendor/laravel/framework/config/logging.php

database 目录

database 目录大致相同。不过,你会发现迁移(migration)文件名前缀不显示日期,只是按照需要的顺序的保留前缀。create_personal_access_tokens.php 迁移文件不在存在于项目中。只有在你创建 API 时,才有需要,创建 API 也会带来 routes 目录的修改。

同时会默认安装 database.sqlite 文件,除非你在创建全新 Laravel 应用时,选择了其他数据库选项。

routes 目录

路由目录也同时被精简到只包含 web.phpconsole.php 路由文件。如果你项创建 API 或者使用广播功能,你可以通过 artisan 命令进行安装:

php artisan install:api
php artisan install:broadcasting

这些命令将带来所需的迁移、JavaScript 和配置文件。这样做的好处是,不需要广播或API路由的应用不必担心这些不必要的文件存在于项目中。

Laravel 11 routes directory

test 目录

在 Laravle 11 项目中 test/ 目录不再包含 CreatesApplication trait。如果升级 Laravel 10 项目,可以移除该 trait。它的功能现在由框架的基础 TestCase 提供。

在 Laravl 10 项目中,Laravle 10 的基础 TestCase 类只包含 CreatesApplication trait,它在每次测试之前作为设置的一部分创建全新应用启动应用。一旦您将现有应用升级到 Laravel 11,就可以安全地删除此特性(及其使用情况)。

从 Laravel 10 升级到 Laravel 11

你根本不需要更改 Laravel 10 应用程序的结构即可升级到 Laravel 11。这将只是全新应用的结构,如果愿意,你仍然可以使用旧的方式。

了解更多信息

如果你想了解更多关于 Laravel 11 的信息,请查看我们的 Laravel 11 文章,了解这个令人兴奋的新版本的所有细节。