code-distortion/laravel-auto-reg

一个用于在非标准目录结构的 Laravel 项目中自动注册您的服务提供者、配置、命令、路由、广播频道、迁移、blade 模板和翻译等的 Laravel 扩展包。

0.1.12 2024-08-14 03:57 UTC

This package is auto-updated.

Last update: 2024-09-14 04:44:34 UTC


README

Latest Version on Packagist PHP Version Laravel GitHub Workflow Status Buy The World a Tree Contributor Covenant

code-distortion/laravel-auto-reg 是一个 Laravel 扩展包,它会在非标准目录结构的 Laravel 项目中为您自动注册服务提供者、配置、命令、路由、广播频道、迁移、blade 模板和翻译等。

目录

简介

默认情况下,Laravel 被设计为从某些地方消耗您的资源。例如,当您访问视图 view('homepage') 时,它从 resources/views 目录解析,配置文件自动从 config/* 加载,路由从 routes/web.phproutes/api.php 注册。

如果您更改了代码库的结构,您需要告诉 Laravel 它们在哪里。这对于拥有自己资源的扩展包来说实际上是非常正常的。

要在您的 Laravel 项目中这样做,您会使用 Laravel 为扩展包提供用于注册其资源工具。

Laravel Auto-Reg 的目标是在不需要您自己管理资源注册的情况下,允许您以不同的方式构建 Laravel 项目。

Auto-Reg 也是管理您的资源的好方法。

Laravel Auto-Reg 受 Spatie 的 Brent Roose 编写的 Laravel Beyond Crud 书籍的启发,该书籍描述了一个被拆分为 应用领域 层的 Laravel 代码库。这些 "应用" 类似于小型 Laravel 应用,但旨在只包含像 控制器中间件请求命令 这样的脚手架代码,其唯一目的是在请求(或命令)和存储在 "领域" 中的领域业务逻辑之间充当中间件。

进一步灵感来源于 Laravel Modules,由 Nicolas Widart 提出,它引入了 模块,类似于迷你 Laravel 项目。区别在于,“模块” 包含了 Laravel app 目录中的 所有 内容——包括上述提到的脚手架“app”代码和业务“领域”逻辑。

安装

通过 composer 安装包

composer require code-distortion/laravel-auto-reg

包将自动注册自己。

配置

发布 config/code_distortion.laravel_auto_reg.php 配置文件

php artisan vendor:publish --provider="CodeDistortion\LaravelAutoReg\LaravelAutoRegServiceProvider" --tag="config"

然后更新 source_dir 配置值,将其指向代码的基础目录。 base_path('src/App')

非标准目录结构的 Laravel 项目

以下是一些步骤,可以帮助您设置 Laravel 项目的非标准目录结构。在这种情况下,将 app 中的内容移动到 src/App,并以此作为基础放置其他代码。

更新 composer.json

为了让您的项目识别 src/App 目录中的文件而不是通常的 app 目录中的文件,您需要告诉 Laravel。

您可以将现有的 App 命名空间移动到不同的目录,并通过更新 composer.json 添加新的命名空间。以下示例将 App 命名空间移动到 src/App,并在 src/Domain 中添加一个新的 Domain 命名空间。

// composer.json

{
  // …
  "autoload" : {
    "psr-4" : {
      "App\\" : "src/App/",
      "Domain\\" : "src/Domain/"
    }
  }
}

更新 bootstrap/app.php

当移动 Laravel 的 App 命名空间(如上所述)时,您还需要更新 bootstrap/app.php,以便 Laravel 在启动时使用它。

// bootstrap/app.php

// Original
$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

// Replace with
$app = (new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
))->useAppPath(realpath(__DIR__.'/../src/App'));

Laravel Beyond CRUD 建议使用 ->useAppPath('src/App');,但根据我的经验,这与 Laravel Livewire 不兼容。

Laravel 使用其 HTTP KernelConsole KernelExceptions Handler 类分别处理网页请求、控制台命令和异常。这些类必须存在,但您可以通过更新 bootstrap/app.php 来移动它们。

// bootstrap/app.php

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class // <--- update to the new location
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class // <--- update to the new location
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class // <--- update to the new location
);

更新 config/app.php

Auto-Reg 会自动加载您的应用程序服务提供者,因此您需要在 config/app.php 中禁用它们。

// config/app.php

    'providers' => [
    
        // …
    
        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,          // <--- comment these out
        App\Providers\AuthServiceProvider::class,         // <--- comment these out
        // App\Providers\BroadcastServiceProvider::class, // <--- comment these out
        App\Providers\EventServiceProvider::class,        // <--- comment these out
        App\Providers\RouteServiceProvider::class,        // <--- comment these out
    ],

目录结构

注意: 从此处开始,一个 app 将指代一组结构相似的文件。您的项目中将存在多个 app

一组文件可能看起来像这样。您可以决定包含或排除什么内容。

src/App/Home/
├─┬ Commands
│ └── NotifyPostSubscribers.php
├─┬ Configs
│ └── blog.php
├─┬ Controllers
│ └── BlogController.php
├─┬ Migrations
│ └── 2020_12_12_000000_create_blog_posts_table.php
├─┬ Requests
│ └── SubmitPostRequest.php
├─┬ Routes
│ ├── api.php
│ ├── channels.php
│ ├── console.php
│ └── web.php
├─┬ ServiceProviders
│ └── EventServiceProvider.php
└─┬ Resources
  ├─┬ Lang
  │ └─┬ en
  │   ├── general.php
  │   └── home.php
  ├─┬ Views
  │ ├─┬ components
  │ │ ├── comment.php
  │ │ └── post.php
  │ └── view-posts.php
  └─┬ ViewComponents
    └── Post.php

Auto-Reg 并不关心您在 apps 中如何结构代码 内部,您可以决定将什么放入其中。

您可以通过将它们分组到子目录中(如下面的示例所示)来将 apps 分组。您可以根据需要将项目细化。

一个博客网站,旨在让用户注册、创建和查看帖子以及编写评论,同时还拥有一个管理员区域供管理员管理用户,可能看起来像这样

src/App/Admin/Auth/…
├── Commands
├─┬ Configs
│ ├── admin.php
…
src/App/Admin/Dashboard/…
src/App/Admin/UserManagement/…
src/App/Front/ContactUs/…
src/App/Front/Home/…
src/App/Front/Posts/…
src/App/Front/Registration/…

假设您已将配置 source_dir 值设置为 base_path('src/App'),Auto-Reg 将从目录结构中检测这些 apps

admin.auth
admin.dashboard
admin.user-management
front.contact
front.home
front.posts
front.registration

使用方法

首先,将您的 apps 位置添加到 source_dir配置文件 中。这是 Auto-Reg 查找文件的基目录。

您可以通过添加一个数组而不是字符串来指定多个源目录。

Laravel Auto-Reg 通过匹配您的目录结构到模式来查找您的资源。您可以在 配置文件 中更改这些模式。

Auto-Reg 使用每种类型的文件的一个搜索模式。以下是可以注册的不同内容。

搜索模式中的 ** 代表零个或多个通配符目录。

配置文件

搜索模式:Configs/**/*.php

配置文件被添加到 Laravel 的配置中,并且会添加 app 的名称作为前缀。

您可以通过使用 config('home.blog.my_value') 获取到 src/App/Home/Configs/blog.php 文件中的值。

您可以关闭应用前缀,而是使用 config('blog.my_value') 来访问值。

服务提供者

搜索模式:Providers/**/*.php

服务提供器类(继承自 Illuminate\Support\ServiceProvider)将被拾取并注册。您无需将它们添加到 configs/app.php 中。

路由

API 路由搜索模式:Routes/api.php
Web 路由搜索模式:Routes/web.php

路由文件通常通过 RouteServiceProvider 类进行注册。虽然您仍然可以这样做,但 Auto-Reg 会为您自动注册 api.phpweb.php 路由文件(以及相应的 "api" 和 "web" 中间件)。

您可以自定义添加哪些中间件。

命令类

命令类搜索模式:Commands/**/*.php

命令类(继承自 Illuminate\Console\Command)将被拾取并注册。您无需将它们添加到 app/Console/Kernel.php 中。

命令闭包(console.php)

命令闭包文件搜索模式:Routes/console.php

命令也可以通过 console.php 文件进行注册,类似于路由的注册方式。Auto-Reg 会找到这些文件并为您注册它们。

广播频道(channels.php)

搜索模式:Routes/channels.php

广播频道通过 channels.php 文件进行注册,类似于路由的注册方式。

在 Laravel 项目中,广播不是必需的,且初始化相对较慢。这可能是为什么在正常的 Laravel 项目中,BroadcastServiceProvider 默认在 config/app.php 中被禁用的原因。

在 Laravel Auto-Reg 中,广播类型也默认被禁用,但您可以通过配置文件再次启用它。

视图目录

搜索模式:Resources/Views/**/*.php
如果找到文件,则会注册 Resources/Views 目录。

Blade 目录被注册,并将应用程序的名称添加为前缀。

例如,使用 view('home::blog') 可以访问 src/App/Home/Resources/Views/blog.php 文件。

如果将匿名 Blade 组件放在 components 目录中,它们也是可用的。

例如,使用 <x-home::button /> 可以访问 src/App/Home/Resources/Views/components/button.php 文件。

注意: 如果您发现 Blade 模板没有被另一个模板拾取,您可能需要重新保存父模板文件以触发更改。

视图组件类

搜索模式:Resources/ViewComponents/**/*.php

命令类(继承自 Illuminate\View\Component)将被拾取并注册。

与上面的视图目录一样,应用程序的名称被添加为前缀。

例如,使用 <x-home::button /> 可以访问 src/App/Home/Resources/ViewComponents/Button.php 文件。

注意: 如果您发现 Blade 模板没有被另一个模板拾取,您可能需要重新保存父模板文件以触发更改。

Laravel Livewire 组件

搜索模式:Resources/Livewire/**/*.php

如果您使用 Laravel Livewire,则 Livewire 组件也会类似于视图组件类进行注册。

应用程序的名称被添加为前缀。

例如,使用 <livewire:home::button /> 可以访问 src/App/Home/Resources/Livewire/button.php 文件。

翻译

搜索模式:Resources/Lang/**/*.php
如果找到文件,则会注册 Resources/Lang 目录。

翻译目录被注册,并将应用程序的名称添加为前缀。

例如,使用 __('home::blog.success') 可以访问 src/App/Home/Resources/Lang/en/blog.php 文件。

迁移

搜索模式:Database/Migrations/*.php
如果找到文件,则会注册 Database/Migrations 目录。

控制台命令

列表

php artisan auto-reg:list

这将列出已注册的资源。

您可以通过以下方式缩小结果:

  • 传递特定的应用程序。例如,php artisan auto-reg:list --app=home
  • 传递特定的文件类型。例如,php artisan auto-reg:list --type=config

您还可以指定如何对结果进行分组。例如,php artisan auto-reg:list --group-by=type

保存缓存

php artisan auto-reg:cache

Auto-Reg 会遍历您的文件系统以查找要注册的文件,这可能需要一些时间。在开发环境中可能不太明显,但建议将其作为部署过程的一部分运行,就像您运行 php artisan config:cachephp artisan route:cache 一样。

Auto-Reg 会缓存检测到的资源文件列表,这样就不需要再次查找它们。

请注意,当文件被缓存后,添加或删除资源文件不会被发现,直到您清除缓存。

清除缓存

php artisan auto-reg:clear

这将清除 Auto-Reg 的缓存,与 php artisan config:clearphp artisan route:clear 清除配置和路由缓存的方式相同。

统计数据

php artisan auto-reg:stats

这将列出注册步骤所需的时间以及注册的项目数量。

您可以通过以下方式减少所需时间:

  • 缓存 Auto-Reg 检测到的文件列表 php artisan auto-reg:cache(如上所述)
  • 使用 php artisan config:cache 缓存 Laravel 的配置
  • 使用 php artisan route:cache 缓存 Laravel 的路由

广播类型注册相对较慢。如果您不需要,应该将其关闭(Laravel 默认在新项目中关闭它)。

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

语义版本

此库使用 SemVer 2.0.0 版本控制。这意味着对 X 的更改表示破坏性更改:0.0.X0.X.yX.y.z。当此库更改为 1.0.0、2.0.0 等版本时,并不一定表示它是一个值得注意的发布版本,它只是表明更改是破坏性的。

开源

此软件包是 Treeware。如果您在生产中使用它,那么我们要求您为世界买一棵树以感谢我们的工作。通过为 Treeware 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。

贡献

有关详细信息,请参阅 CONTRIBUTING

行为准则

有关详细信息,请参阅 CODE_OF_CONDUCT

安全

如果您发现任何安全问题,请通过电子邮件 tim@code-distortion.net 而不是使用问题跟踪器。

致谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件