当前位置: 首页 > 知识库问答 >
问题:

Symfony4将外部类库用作服务

邓兴为
2023-03-14

我有一个小的外部库,它公开了许多类。

在我的symfony4项目中,我想声明我的类来自供应商,作为带有autowire和public的服务。因此,我将我的库包含在composer中,并将类似这样的psr配置添加到composer中。json:

"autoload": {
        "psr-4": {
            "App\\": "src/",
            "ExternalLibrary\\": "vendor/external-library/api/src/"
        }
    }

在那之后,我试图改变我的服务。yaml进入symfony,如下所示:

ExternalLibrary\:
    resource: '../vendor/external-library/api/src/*'
    public: true
    autowire: true

如果启动测试或运行应用程序,则会返回以下错误:

Cannot autowire service "App\Domain\Service\MyService": argument "$repository" of method "__construct()" references interface "ExternalLibrary\Domain\Model\Repository" but no such service exists. You should maybe alias this interface to the existing "App\Infrastructure\Domain\Model\MysqlRepository" service.

如果我申报服役。yaml此界面工作正常:

ExternalLibrary\Domain\Model\Lotto\Repository:
    class: '../vendor/external-library/api/src/Domain/Model/Repository.php'
    public: true
    autowire: true

但是我有很多类,我不想声明每个类,如果不声明每一个服务,我怎么能修复services.yaml呢?

谢谢

共有3个答案

裴焱
2023-03-14

我也有同样的问题,有人给了我这个解决方案,对我来说效果很好:

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

我在这里复制用户@DasBen的其他解决方案,以防万一:

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

问题可能是您正在导入您的模型,而这些模型不应该被导入。

在Symfony示例项目中,有一部分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."}'

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

谢英耀
2023-03-14

让我们以Dompdf为例:

当您尝试在操作控制器或服务方法中添加type-hint Dompdf时,会出现一个错误,说自动连接是不可能的,因为Dompdf是一个外部PHP库

所以为了解决这个问题,我们将对我们的服务做一点改变。通过添加此短配置,可以创建yaml文件

Dompdf\: #Add the global namespace
   resource: '../vendor/dompdf/dompdf/src/*' #Where can we find your external lib ?
   autowire: true  #Turn autowire to true

将上述示例应用于所有外部PHP库:)

这就是全部!

顾炎彬
2023-03-14

您需要手动创建服务:我没有测试它,但它应该是这样的

services.yaml

Some\Vendor\:
    resource: '../vendor/external-library/api/src/*'
    public: true # should be false

Some\Vendor\FooInterface:
    alias: Some\Vendor\Foo # Interface implementation

Some\Vendor\Bar:
    class: Some\Vendor\Bar
    autowire: true

php

<?php

namespace Some\Vendor;

class Foo implements FooInterface
{

}

class Bar
{
    public function __construct(FooInterface $foo)
    {

    }
}

更准确地说,你应该有这样的东西

ExternalLibrary\Domain\Model\Repository:
    alias: App\Infrastructure\Domain\Model\MysqlRepository
 类似资料:
  • 我使用位于github的两个自主开发的库作为私有存储库,这样我就可以在几个项目中重用它。我包括他们通过作曲家: 现在symfony抱怨找不到类和服务。我的第一个问题是:为什么它们不像symfony使用的库中的其他类那样自动加载,例如swiftmailer、phpmd、diablomedia/prettyprinter?所有都是库,默认情况下不是symfony的一部分。 然而,这里的其他回答说,我必

  • 问题内容: 我在Java项目中添加了一些外部库(在netbeans中)。 是否可以将外部jar库放入Java存档(而不是将其放入单独的(例如)“ lib”目录)? 问题答案: 当然可以。可以使用包含所有依赖项的“捆绑罐”下载一些开源项目。 您需要提取所有jar,然后将其再次打包到一个文件中。在此处 可以看到使用Ant进行此操作的示例。

  • 此功能的状态是实验性的。我们欢迎您对此功能的实用性的反馈。我们可能会在未来发展这个功能,使其更加通用。虽然我们将努力确保向后兼容性,但不能保证。 场景 在某些情况下,希望能够从交易处理函数中调用REST API。这使你可以将区块链中的复杂计算移出。调用REST API允许交易处理器功能将复杂或昂贵的计算外包给中央或peer托管的服务。 调用外部REST服务 post(url,data)函数可用于交

  • 我希望托管在 Openshift 集群中的应用程序面向外部 REST API,而无需在客户端应用程序中硬编码 IP/PORT,并且能够在不重新交付应用程序的情况下更改 IP/PORT。 我设法通过ConfigMap做到了这一点,但我看到也可能通过OpenShift doc中的服务做到这一点。 然而,我没有设法理解它是如何工作的。我做了以下操作: 在第一个curl中,使用endpoint中定义的地址

  • 我只是在本地mac上使用mini kube设置kubernetes。 创建了一个类型为NodePort的服务,并且能够使用url

  • 问题内容: 如何将外部库和嵌套的外部库添加到android项目? 我的项目结构(不允许更改) 应用/ App1 / build.gradle settings.gradle 图书馆/ 图书馆1 / 建立等级 settings.gradle 图书馆2 / 建立等级 settings.gradle 图书馆3 / 建立等级 settings.gradle 图书馆4 / 建立等级 settings.gra