jhavenz/laravel-migration-table-parser

使用 nikic/php-parser 从 Laravel 迁移文件中提取表名

1.0.0 2024-08-04 11:50 UTC

This package is auto-updated.

Last update: 2024-09-04 12:10:57 UTC


README

借助 nikic/php-parser 从 Laravel 迁移文件中提取表名(s)

基本用法

此包检查迁移文件中 up/down 方法使用的代码。

use Jhavenz\LaravelMigrationTableParser\Facades\MigrationTableParser;

$result = MigrationTableParser::parse($file);

$result 是一个类型为 \Jhavenz\LaravelMigrationTableParser\ParserResult 的值对象

$optionalTable = $result->search('my_table');

$optionalTable 是一个 \Prewk\Option 实例,这是一个受 Rust 启发的 Some/None 摩纳德。 了解更多

$tablesFoundCollection = $result->tables();

$tablesFoundCollection 是一个 \Illuminate\Support\Collection<string> 实例

深入了解 /tests 以获取更多信息

实现说明

你可以在你的迁移文件中运行任何其他逻辑,但表名是在你调用这些方法之一时提取的

  • ->drop('users');
  • ->dropIfExists('users');
  • ->table('users', function (Blueprint $table) {...});
  • ->create('users', function (Blueprint $table) {...}); 在所有情况下,该包都将 'users' 作为表名提取

此包为你提供了几个扩展点,以便你实现自己的逻辑。

查看这些接口

一旦实现,你可以像这样将自定义类传递给解析器

use Jhavenz\LaravelMigrationTableParser\Facades\MigrationTableParser;

$result = MigrationTableParser::parse($file)
    ->setStrategies(MyCustomExtractionStrategy::class)
    ->setVisitors(MyCustomTableNameVisitor::class)
    ->parse(database_path('migrations/2021_01_01_000000_create_some_table.php'));

注意:当解析器运行时,这些实现由服务容器解析。

添加您自己的逻辑的另一种方法是将其添加到配置文件中

// Push, leaving the default strategies in place
config()->push('migration-table-parser.strategies', [MyCustomExtractionStrategy::class]);

// Override the default strategies
config()->set('migration-table-parser.strategies', [MyCustomExtractionStrategy::class]);

安装

您可以通过 composer 安装此包

composer require jhavenz/laravel-migration-table-parser

发布

您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="migration-table-parser-config"

这是发布配置文件的内容

<?php

use Jhavenz\LaravelMigrationTableParser\ExtractMigrationTableVisitor;

return [
    'visitors' => [
        ExtractMigrationTableVisitor::class
    ],
    'strategies' => [
        Jhavenz\LaravelMigrationTableParser\ExtractionStrategies\Drop::class,
        Jhavenz\LaravelMigrationTableParser\ExtractionStrategies\DropIfExists::class,
        Jhavenz\LaravelMigrationTableParser\ExtractionStrategies\CreateOrAlterTableMethodIsCalled::class
    ]
];

高级用法

\Jhavenz\LaravelMigrationTableParser\ParserResult 提供了一些便利方法,帮助您处理从迁移文件中提取的每个结果。它基本的结构如下

readonly class ParserResult
{
    public function __construct(
        private bool $successful,
        private string $message,
        private string $migrationFile,
        private array $tablesFound = [],
        private ?Throwable $error = null,
    ) {}

    // ... other methods
}

除了上述属性的获取器之外,它还具有以下签名的方法

  • public function search(string $name): Option
  • public function table(int $index = 0): ?string
  • public function expect(): \Pest\Expectation

最后,解析器会发出您可以监听的事件。

它们的基本结构包括

readonly class ParsingStarted
{
    public function __construct(
        public string $migrationFile,
        public Parser $parser
    ) {}
}

readonly class ParsingCompleted
{
    public function __construct(
        public ParserResult $result,
        public Parser $parser
    ) {}
}

您可以使用 Laravel 的事件系统来监听这些事件,例如

use Jhavenz\LaravelMigrationTableParser\Events\ParsingStarted;

Event::listen(ParsingStarted::class, function (ParsingStarted $event) {
    // do stuff...
});

测试

Pest 用于测试,并且此存储库的初始提交包含约 30-40 个测试。

composer test

变更日志

请参阅 CHANGELOG 了解最近的变化。

贡献

欢迎贡献。

安全漏洞

如果您发现任何与安全相关的问题,请尽快 发邮件给我

许可证

麻省理工学院许可证(MIT)。请参阅许可证文件获取更多信息。