keboola/php-component

开发Keboola PHP组件的帮助类

10.1.5 2024-08-14 06:41 UTC

README

在KBC中运行的PHP组件的通用库。该库提供了与Docker Runner相关的功能。

安装

composer require keboola/php-component

用法

创建BaseComponent的子类。

<?php
class Component extends \Keboola\Component\BaseComponent
{
    protected function run(): void
    {
        // get parameters
        $parameters = $this->getConfig()->getParameters();

        // get value of customKey.customSubKey parameter and fail if missing
        $customParameter = $this->getConfig()->getValue(['parameters', 'customKey', 'customSubKey']);

        // get value with default value if not present
        $customParameterOrNull = $this->getConfig()->getValue(['parameters', 'customKey'], 'someDefaultValue');

        // get manifest for input file
        $fileManifest = $this->getManifestManager()->getFileManifest('input-file.csv');

        // get manifest for input table
        $tableManifest = $this->getManifestManager()->getTableManifest('in.tableName');

        // write manifest for output file
        $this->getManifestManager()->writeFileManifest(
            'out-file.csv',
            (new OutFileManifestOptions())
                ->setTags(['tag1', 'tag2'])
        );

        // write manifest for output table
        $this->getManifestManager()->writeTableManifest(
            'data.csv',
            (new OutTableManifestOptions())
                ->setPrimaryKeyColumns(['id'])
                ->setDestination('out.report'),
            true // legacy manifest format flag
        );
    }

    protected function customSyncAction(): array
    {
        return ['result' => 'success', 'data' => ['joe', 'marry']];
    }

    protected function getSyncActions(): array
    {
        return ['custom' => 'customSyncAction'];
    }
}

使用此src/run.php模板。

<?php

declare(strict_types=1);

use Keboola\Component\Logger;

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

$logger = new Logger();
try {
    $app = new MyComponent\Component($logger);
    $app->execute();
    exit(0);
} catch (\Keboola\Component\UserException $e) {
    $logger->error($e->getMessage());
    exit(1);
} catch (\Throwable $e) {
    $logger->critical(
        get_class($e) . ':' . $e->getMessage(),
        [
            'errFile' => $e->getFile(),
            'errLine' => $e->getLine(),
            'errCode' => $e->getCode(),
            'errTrace' => $e->getTraceAsString(),
            'errPrevious' => $e->getPrevious() ? get_class($e->getPrevious()) : '',
        ]
    );
    exit(2);
}

同步操作支持

同步操作可以通过API直接调用。API会阻塞并等待结果。根据配置中的action键选择正确的操作。BaseComponent类会自动处理选择。它还处理操作结果的序列化和输出 - 同步操作必须输出有效的JSON。

实现同步操作

  • 在你的Component类中添加一个方法。命名完全由你决定。
  • 重写Component::getSyncActions()方法,以返回包含你的同步操作名称作为键和对应的Component类方法名称的值的数组。
  • 方法的返回值将被序列化为JSON

自定义配置

自定义配置获取器

你可能想在配置中添加自定义参数的获取方法。这样你就不需要记住确切的键(parameters.customKey.customSubKey),而是可以使用一个方法来获取值($config->getCustomSubKey())。

简单地创建自己的Config类,该类扩展BaseConfig,并重写\Keboola\Component\BaseComponent::getConfigClass()方法以返回你的新类名称。

class MyConfig extends \Keboola\Component\Config\BaseConfig 
{
    public function getCustomSubKey()
    {
        $defaultValue = 0;
        return $this->getValue(['parameters', 'customKey', 'customSubKey'], $defaultValue);
    }
}

以及

class MyComponent extends \Keboola\Component\BaseComponent
{
    protected function getConfigClass(): string
    {
        return MyConfig::class;
    }
}

自定义参数验证

要验证输入参数,扩展\Keboola\Component\Config\BaseConfigDefinition类。通过重写getParametersDefinition()方法,你可以验证配置的参数部分。确保返回你添加的实际节点,而不是TreeBuilder。你可以使用parent::getParametersDefinition()来获取默认节点,或者你可以自己构建它。

如果你需要验证配置的其他部分,可以重写getRootDefinition()方法。同样,确保返回实际的节点,而不是TreeBuilder

class MyConfigDefinition extends \Keboola\Component\Config\BaseConfigDefinition
{
    protected function getParametersDefinition()
    {
        $parametersNode = parent::getParametersDefinition();
        $parametersNode
            ->isRequired()
            ->children()
                ->arrayNode('customKey')
                    ->isRequired()
                    ->children()
                        ->integerNode('customSubKey')
                            ->isRequired();
        return $parametersNode;
    }
}

注意:由于\Symfony\Component\Config\Definition\Builder\ExprBuilder::end()方法的复杂类型行为,你的构建可能会因为PhpStan而失败,因此你可能需要忽略一些错误

同样,你需要在你的组件中提供新的类名称

class MyComponent extends \Keboola\Component\BaseComponent
{
    protected function getConfigDefinitionClass(): string
    {
        return MyConfigDefinition::class;
    }
}

如果配置定义的任何约束未满足,将抛出UserException。这意味着你不需要自己处理消息。

从版本6迁移到版本7

组件的默认入口点(在index.php中)已从BaseComponent::run()更改为BaseComponent::execute()。请注意,run方法现在不能再是公开的,只能从组件内部调用。

更多阅读

有关更多信息,请参阅生成的文档。有关KBC集成的帮助,请参阅开发指南

许可证

MIT许可,请参阅LICENSE文件。