使用带有 symfony4 自动加载和参数问题的外部存储库

Use an external repository with symfony4 trouble with autoload and parameters

我使用位于 github 的两个自行开发的库作为私有存储库,因此我可以在多个项目中重用它。我通过作曲家包括他们:

"license": "proprietary",
"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/my-account/puc-web-sap-client.git",
        "options": {
            "ssl": {
                "verify_peer": "false"
            }
        }
    },
    {
        "type": "vcs",
        "url": "https://github.com/my-account/puc-web-soap-client.git",
        "options": {
            "ssl": {
                "verify_peer": "false"
            }
        }
    }
],

现在 symfony 抱怨找不到 classes 和服务。 我的第一个问题是: 为什么它们不像 symfony 使用的库中的其他 classes 那样自动加载,例如swiftmailer,phpmd,diablomedia/prettyprinter?所有都是库,默认情况下它们不是 symfony 的一部分。

但是这里的其他答案说,我必须在 services.yaml 中手动添加服务

所以我从我的图书馆添加了大量服务到 services.yaml 文件:

Puc\SapClient\:
    resource: '../vendor/puc/sap-client/src/*'
    autowire: true      # Automatically injects dependencies in your services.
    autoconfigure: true # Automatically registers your services as commands, event subscriber
    public: true


Puc\SapClient\Country\CountrySapServiceInterface:
    alias: Puc\SapClient\Country\CountrySapService

Puc\SapClient\Country\CountryService:
    autowire: true

Puc\SapClient\Currency\CurrencyService:
    autowire: true

Puc\SapClient\House\HouseService:
    autowire: true

Puc\SapClient\Ressort\RessortService:
    autowire: true

Puc\SapClient\Country\CountrySapService:
    autowire: true

Puc\SapClient\Currency\CurrencySapService:
    autowire: true
....

现在 php bin/console debug:autowiring 给我以下错误:

Cannot autowire service "Puc\SapClient\Model\Currency": argument "$currencyIsoCode" of method "__construct()" is type-hinted "string", you should configure its value explicitly.

Well Currency 是一种模型,而不是一种服务。它由我的库填充值并返回给我的主应用程序。 这是构造函数:

public function __construct(
    string $currencyIsoCode,
    string $name,
    string $ident,
    int $numberOfDecimals
) {
    $this->currencyIsoCode = $currencyIsoCode;
    $this->name = $name;
    $this->sapIdent = $ident;
    $this->numberOfDecimals = $numberOfDecimals;
}

如何配置此模型以使用字符串?我在哪里做?我真的必须声明我的图书馆正在使用的每一个 class 吗?定义每个class?

的每个参数

我认为您不必单独导入每个服务。您已经在“Puc\SapClient”部分这样做了。

问题可能是您正在导入不应导入的模型。

在 symfony example project 中有这部分 vor "services.yaml":

# makes classes in src/ available to be used as services
  # this creates a service per class whose id is the fully-qualified class name
  App\:
    resource: '../src/*'
    exclude: '../src/{Bundle,DependencyInjection,Entity,Model,Migrations,Tests,Kernel.php}'

那么你的角色是:

# makes classes in src/ available to be used as services
  # this creates a service per class whose id is the fully-qualified class name
  Puc\SapClient\:
    resource: '../vendor/puc/sap-client/src/*'
    exclude: ''../vendor/puc/sap-client/src/{Entity,Model,"etc."}'

“等等”将是不需要作为服务的一切。