mortexa/laravel-arkitect

在您的Laravel应用程序中测试和强制执行架构规则

v0.8.0 2024-04-25 18:49 UTC

This package is auto-updated.

Last update: 2024-09-25 19:47:16 UTC


README

art/laravel-arkitect.png

Laravel Arkitect

Latest Stable Version Total Downloads Latest Unstable Version License PHP Version Require

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许可证授权。