【问题标题】:symfony 4 - flysystem autowiresymfony 4 - flysystem 自动接线
【发布时间】:2020-04-07 10:11:04
【问题描述】:

你能帮我解决这个问题吗?

无法自动装配服务“App\Estimate\DocumentManager”:方法“__construct()”的参数“$flysystem”引用了类“League\Flysystem\Filesystem”,但不存在此类服务。您可能应该将此类别名为现有的“oneup_flysystem.estimateDocumentsFilesystem_filesystem”服务。

我的配置文件:

parameters:
    flysystem.local.estimate_documents.path: '%kernel.root_dir%/../public/uploads/estimate/documents'

services:
    app.estimate.document_manager:
        class: App\Estimate\DocumentManager
        lazy: true
        public: true
        arguments: ['@doctrine.orm.entity_manager', '@estimateDocumentsFilesystem', '@monolog.logger']

oneup_flysystem:
    filesystems:
        estimateDocumentsFilesystem:
            adapter: estimateDocumentsAdapter
            visibility: public
            alias: "estimate_documents_filesystem"

    adapters:
        estimateDocumentsAdapter:
            local:
                directory: "%flysystem.local.estimate_documents.path%"

class DocumentManager
{

    /**
     * @var EntityManager
     */
    private $manager;

    /**
     * @var Filesystem
     */
    private $flysystem;

    /**
     * @var Logger
     */
    private $logger;

    /**
     * DocumentManager constructor.
     *
     * @param EntityManagerInterface $manager
     * @param Filesystem $flysystem
     * @param Logger $logger
     */
    public function __construct(
        EntityManagerInterface $manager,
        Filesystem $flysystem,
        Logger $logger
    )
    {
        $this->manager = $manager;
        $this->flysystem = $flysystem;
        $this->logger = $logger;
    }
}

非常感谢。我不明白问题出在哪里。

// 编辑:

如果我添加这个如果我在配置中添加这个

services:
League\Flysystem\FilesystemInterface: '@estimate_documents_filesystem'

它只适用于一个文件系统 f.. 有什么问题?

最好的问候 吉米

【问题讨论】:

    标签: filesystems autowired symfony4 flysystem


    【解决方案1】:

    在我看来,禁用自动配置的答案是一个愚蠢的答案,因为 Symfony 的最佳实践是使用它。

    问题是OneupFlysystemBundle 的当前版本没有正确配置它的服务以正确使用 Symfoyny 的自动装配。

    因此,在捆绑包中解决此问题之前,正确的解决方法是手动将接口标记为正确的服务。 在你的 services.yaml 中

    League\Flysystem\FilesystemInterface: "@estimate_documents_filesystem"
    

    (注意:如果您使用此捆绑包的默认配置并按照其步骤操作,则该服务将命名为 "@oneup_flysystem.acme_filesystem",或者按照 Symfony 最佳实践,如果您只有一个文件系统,则它应该命名为 "@oneup_flysystem.app_filesystem"。如果不确定,您可以使用bin/console debug:container 找到正确的服务名称)

    【讨论】:

      【解决方案2】:

      要拥有多个文件系统,请执行以下操作:

      services.yaml
         services:
              _defaults:
                  bind:
                      publicUploadFileSystem: '@oneup_flysystem.public_uploads_filesystem_filesystem'
      oneup_flysystem.yaml
          oneup_flysystem:
              adapters:
                  public_uploads_adapter:
                      local:
                          directory: '%kernel.project_dir%/public/uploads'
              filesystems:
                  public_uploads_filesystem:
                      adapter: public_uploads_adapter
      

      教程:https://symfonycasts.com/screencast/symfony-uploads/flysystem-usage#play

      【讨论】:

      • 返回:` 服务“App\Service\UploaderHelper”依赖于不存在的服务“oneup_flysystem.public_uploads_filesystem_filesystem”。 `
      【解决方案3】:

      需要关闭自动装配和自动配置。添加这个:

      autoconfigure:false
      autowire:false
      

      完整配置:

      App\Estimate\Document\DocumentManager:
          autoconfigure: false
          autowire: false
          arguments: ['@doctrine.orm.entity_manager', '@estimate_documents_filesystem', '@monolog.logger']
      
      App\User\DocumentManager:
          autoconfigure: false
          autowire: false
          arguments: ['@doctrine.orm.entity_manager', '@user_avatars_filesystem', '@monolog.logger']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 2019-02-02
        • 2023-03-16
        • 1970-01-01
        • 2019-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多