【问题标题】:Check if migration exists in Laravel package service provider检查 Laravel 包服务提供者中是否存在迁移
【发布时间】:2021-10-28 23:13:00
【问题描述】:

我正在编写一个 Laravel 包,在其服务提供者中,该包使用以下代码接收要发布的迁移列表:

protected function publishMigrations(array $publishables): void
{
    // Generate a list of migrations that have not been published yet.
    $migrations = [];
    foreach($publishables as $publishable)
    {
        // Migration already exists, continuing
        if(class_exists($publishable)){
            continue;
        }
        $file = Str::snake($publishable) . '.php';
        $migrations[self::MIGRATIONS_PATH . $file . '.stub'] = database_path('migrations/'.date('Y_m_d_His', time())."_$file");
    }

    $this->publishes($migrations, 'migrations');
}

包的$publishables 示例如下:

$publishables = ['CreateAuthenticationsTable', 'CreateCustomersTable', 'CreateTransactionsTable'];

代码确实按预期工作,发布了我打算发布的迁移,但是,我试图避免使用class_exists($publishable) 行两次发布相同的迁移。据我了解,Laravel MediaLibrary 正在使用相同的方法。但我猜在发布资产时不会加载迁移,因为那段代码永远不会运行。 (class_exists 一直为假)

有没有办法可以跟踪已发布的迁移?这是自动加载问题吗?

【问题讨论】:

    标签: php laravel laravel-package


    【解决方案1】:

    migrationExists($mgr) 函数将检查database/migrations 中是否存在迁移文件。它将遍历迁移文件名并检查给定迁移名称的名称匹配。

    protected function publishMigrations()
        {
            if (!$this->migrationExists('create_admins_table')) {
                $this->publishes([
                  __DIR__ . '/database/migrations/create_admins_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_admins_table.php'),
                  // you can add any number of migrations here
                ], 'migrations');
                return;
            }
        }
    
    
    
    protected function migrationExists($mgr)
        {
            $path = database_path('migrations/');
            $files = scandir($path);
            $pos = false;
            foreach ($files as &$value) {
                $pos = strpos($value, $mgr);
                if($pos !== false) return true;
            }
            return false;
        }
    

    【讨论】:

    • 感谢您的功能。你知道为什么 class_exist 返回 false 吗?
    猜你喜欢
    • 2019-06-08
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2015-10-24
    • 2016-10-06
    相关资源
    最近更新 更多