mortexa / laravel-arkitect
在您的Laravel应用程序中测试和强制执行架构规则
Requires
- php: ^8.0
- phparkitect/phparkitect: ^0.3.19
Requires (Dev)
- laravel/pint: ^1.3
- orchestra/testbench: ^7.17|^8.0
- pestphp/pest: ^1.22
- pestphp/pest-plugin-laravel: ^1.3
- phpunit/phpunit: ^9.5
README
Laravel Arkitect
Laravel Arkitect 允许您在Laravel应用程序中测试和强制执行架构规则,并且它是Laravel的PHPArkitect包装器。此包帮助您保持应用程序架构的整洁和一致性。
├─ storage
├─ tests
│ ├─ Architecture ✅
│ ├─ Browser
│ ├─ Feature
│ └─ Unit
└─ vendor
安装
您可以通过Composer安装此包
composer require mortexa/laravel-arkitect --dev
用法
首先,您应该通过运行以下Artisan命令创建您的架构规则
php artisan make:arkitect ControllersNaming
运行该命令后,将在应用程序的 tests/Architecture
目录中创建一个名为 ControllersNaming.php
的文件,如下所示
<?php namespace Tests\Architecture; use Arkitect\Rules\DSL\ArchRule; use Mortexa\LaravelArkitect\Contracts\RuleContract; use Mortexa\LaravelArkitect\Rules\BaseRule; class ControllersNaming extends BaseRule implements RuleContract { /** * Define your architectural rule * * @link https://github.com/phparkitect/arkitect * * @return \Arkitect\Rules\DSL\ArchRule */ public static function rule(): ArchRule { // TODO: Implement rule() method. } /** * Define the path related to your rule * * @example app/Http/Controllers * * @return string */ public static function path(): string { // TODO: Implement path() method. } }
然后,您必须根据以下 示例 实现 rule()
和 path()
方法。
最后,您可以通过以下命令运行测试
php artisan test:arkitect
完成!
如果您想在第一次违规后立即停止检查命令,可以使用
--stop-on-failure
选项。
有关所有可用规则,请参阅PHPArkitect存储库: https://github.com/phparkitect/arkitect
默认规则
该包提供了一些有见地的规则并默认应用。这些规则是关于Laravel用户空间结构的。您可以通过发布配置文件来自定义或完全忽略它们。
示例
<?php namespace Tests\Architecture; use Arkitect\Expression\ForClasses\HaveNameMatching; use Arkitect\Expression\ForClasses\ResideInOneOfTheseNamespaces; use Arkitect\Rules\DSL\ArchRule; use Arkitect\Rules\Rule; use Mortexa\LaravelArkitect\Contracts\RuleContract; use Mortexa\LaravelArkitect\Rules\BaseRule; class ControllersNaming extends BaseRule implements RuleContract { public static function rule(): ArchRule { return Rule::allClasses() ->that(new ResideInOneOfTheseNamespaces('App\Http\Controllers')) ->should(new HaveNameMatching('*Controller')) ->because('It\'s a Laravel naming convention'); } public static function path(): string { return 'app/Http/Controllers'; } }
配置
如果您想自定义包提供的默认规则,可以使用以下Artisan命令发布Laravel Arkitect配置文件
php artisan vendor:publish --provider="Mortexa\LaravelArkitect\ArkitectServiceProvider" --tag="config"
arkitect
配置文件将放置在应用程序的 config
目录中。
// config/arkitect.php <?php use ... return [ 'rules' => [ 'naming' => [ ControllersNaming::class, ExceptionsNaming::class, NotificationsNaming::class, ObserversNaming::class, ProvidersNaming::class, RequestsNaming::class, ResourcesNaming::class, ChannelsNaming::class, SeedersNaming::class, PoliciesNaming::class, FactoriesNaming::class, ScopesNaming::class, BuildersNaming::class, ContractsNaming::class, RepositoriesNaming::class, MailsNaming::class, ], 'extending' => [ ControllersExtending::class, CommandsExtending::class, ExceptionsExtending::class, RequestsExtending::class, ResourcesExtending::class, ResourceCollectionsExtending::class, ModelsExtending::class, NotificationsExtending::class, ProvidersExtending::class, ViewsExtending::class, FactoriesExtending::class, SeedersExtending::class, MailsExtending::class, ], 'implementing' => [ RulesImplementing::class, CastsImplementing::class, ScopesImplementing::class, JobsImplementing::class, ], ], 'ignored_namespaces' => [], ];
忽略命名空间
如果您想忽略任何命名空间进行架构测试,请在配置文件中将相关路径添加到 ignored_namespaces
键。
贡献
感谢您考虑贡献!如果您发现一个问题,或有更好的方法来做某事,请随时打开一个问题或PR。
许可证
此存储库是开源软件,根据MIT许可证授权。