code-distortion / laravel-auto-reg
一个用于在非标准目录结构的 Laravel 项目中自动注册您的服务提供者、配置、命令、路由、广播频道、迁移、blade 模板和翻译等的 Laravel 扩展包。
Requires
- php: 7.4.* | 8.0.* | 8.1.* | 8.2.* | 8.3.*
- ext-fileinfo: *
- ext-mbstring: *
- illuminate/support: ^8.0 | ^9.0 | ^10.0 | ^11.0
Requires (Dev)
- fakerphp/faker: ^1.0
- infection/infection: ^0.10 | ^0.11 | ^0.12 | ^0.13 | ^0.14 | ^0.15 | ^0.16 | ^0.17 | ^0.18 | ^0.19 | ^0.20 | ^0.21 | ^0.22 | ^0.23 | ^0.24 | ^0.25 | ^0.26 | ^0.27
- livewire/livewire: ^1.0 | ^2.0 | ^3.0
- orchestra/testbench: ^6.0 | ^7.0 | ^8.0 | ^9.0
- phpstan/phpstan: ^0.7 | ^0.8 | ^0.9 | ^0.10 | ^0.11 | ^0.12 | ^1.0
- phpunit/phpunit: ~4.8 | ^5.0 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0
- squizlabs/php_codesniffer: ^3.10
README
code-distortion/laravel-auto-reg 是一个 Laravel 扩展包,它会在非标准目录结构的 Laravel 项目中为您自动注册服务提供者、配置、命令、路由、广播频道、迁移、blade 模板和翻译等。
目录
简介
默认情况下,Laravel 被设计为从某些地方消耗您的资源。例如,当您访问视图 view('homepage')
时,它从 resources/views
目录解析,配置文件自动从 config/*
加载,路由从 routes/web.php
和 routes/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 Kernel
、Console Kernel
和 Exceptions 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.php
和 web.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:cache
和 php artisan route:cache
一样。
Auto-Reg 会缓存检测到的资源文件列表,这样就不需要再次查找它们。
请注意,当文件被缓存后,添加或删除资源文件不会被发现,直到您清除缓存。
清除缓存
php artisan auto-reg:clear
这将清除 Auto-Reg 的缓存,与 php artisan config:clear
和 php 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.X
、0.X.y
、X.y.z
。当此库更改为 1.0.0、2.0.0 等版本时,并不一定表示它是一个值得注意的发布版本,它只是表明更改是破坏性的。
开源
此软件包是 Treeware。如果您在生产中使用它,那么我们要求您为世界买一棵树以感谢我们的工作。通过为 Treeware 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。
贡献
有关详细信息,请参阅 CONTRIBUTING。
行为准则
有关详细信息,请参阅 CODE_OF_CONDUCT。
安全
如果您发现任何安全问题,请通过电子邮件 tim@code-distortion.net 而不是使用问题跟踪器。
致谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件。