php 在Laravel中运行composer install命令后将数据存储在数据库中?

vjhs03f7  于 2023-11-16  发布在  PHP
关注(0)|答案(3)|浏览(122)

我正在做Laravel 10项目,我想在运行composer install时向数据库添加一些数据<package_name>。为此,我创建了一个自定义PHP文件,并在composer.json文件中调用postPackageInstall函数。
下面是我如何将其添加到composer.json文件中的

{
    
    <-- OTHER COMPOSER JSON DATA -->

    "scripts": {
        "post-package-install": [
            "Widgets\\PackageInstaller::postPackageInstall"
        ]
      },
    <-- OTHER COMPOSER JSON DATA -->
    }

字符串
这里是我的自定义PHP文件的样子。

<?php

namespace Widgets;

use Composer\Installer\PackageEvent;
use Composer\Script\Event;
use Illuminate\Support\Facades\DB;

class PackageInstaller
{
    protected static $packageName = "";

    public static function postPackageInstall(PackageEvent $event)
    {
        // Get installing package
        $operation = $event->getOperation();

        $package = method_exists($operation, 'getPackage')
            ? $operation->getPackage()
            : $operation->getInitialPackage();

        DB::table('widgets')->insert(['name' => $package->getName()]);
    }
}


在这里,我的想法是在运行composer install命令后获取软件包名称并将其存储在数据库中。但问题是,它会抛出错误

In Facade.php line 350:           
  A facade root has not been set.


我认为这是因为Laravel在这个阶段没有完全加载。另外,我尝试在post-package-install脚本中运行Artisan命令。DB查询在命令中工作,但我无法在命令中获得包名。
有没有其他方法可以解决这个问题或解决这个问题?

htrmnn0y

htrmnn0y1#

你可以试试这个(使用Laravel DB facade):

namespace Widgets;

require __DIR__.'/../vendor/autoload.php';

use Composer\Installer\PackageEvent;
use Illuminate\Contracts\Console\Kernel;
use Illuminate\Support\Facades\DB;

class PackageInstaller
{
    protected static $packageName = "";

    public static function postPackageInstall(PackageEvent $event)
    {
        $app = require_once __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();
    
        $operation = $event->getOperation();

        $package = method_exists($operation, 'getPackage')
            ? $operation->getPackage()
            : $operation->getInitialPackage();

        DB::table('widgets')->insert(
            ['name' => $package->getName()]
        );
    }
}

字符串

u5rb5r59

u5rb5r592#

1.使用DB逻辑创建一个自定义artisan命令。
1.允许通过CLI参数向其传递数据。
1.更新postPackageInstall()以通过exec()运行命令。

omjgkv6w

omjgkv6w3#

我是这样想的,因为Laravel在包卸载后的阶段还没有完全加载,所以我使用了行PHP数据库查询来存储数据。

public static function postPackageInstall(PackageEvent $event)
    {
        // Get installing package
        $operation = $event->getOperation();
        $package = method_exists($operation, 'getPackage')
            ? $operation->getPackage()
            : $operation->getInitialPackage();

        // Extract package name
        $packageName = $package->getName();

        // Perform database operation
        $pdo = new \PDO('mysql:host=127.0.0.1;dbname=my_database', 'username', 'password');
        $stmt = $pdo->prepare('INSERT INTO widgets (name) VALUES (:name)');
        $stmt->bindParam(':name', $packageName);
        $stmt->execute();
    }

字符串
这个方法并不干净。但它确实可以在Laravel的“post-package-uninstall”脚本中工作。

相关问题