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

Symfony 5服务未加载

寿丰
2023-03-14

我有一个类用来上传文件作为服务,比如symfony文档。https://symfony.com/doc/current/controller/upload_file.html#creating-上传服务

我使用Symfony 5。

当我在main config/services.yaml中声明服务时,这项工作正常。

但是我有一个文件管理包,我想把服务声明放在这个包中:App/AD/ExplorerBundle/Resources/config/services.yaml。

当我这样做的时候,这就不起作用了。

我有错误

无法解析“App\AD\ExplorerBundle\Controller\FileController::addAction()”的参数$fileUploader:无法自动连接服务“App\AD\ExplorerBundle\service\fileUploader”:方法“\uu construct()”的参数“$targetDirectory”的类型提示为“string”,应显式配置其值。

我不明白为什么,因为_默认为autoconfigure和autowire=true

我测试缓存:清除、重新加载服务器,但什么都不起作用。

任何帮助都是非常感谢的

编辑:我的捆绑扩展:在AD\ExplorerBundle\DependencyInject

<?php

namespace App\AD\ExplorerBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

/**
 * This is the class that loads and manages your bundle configuration.
 *
 * @link http://symfony.com/doc/current/cookbook/bundles/extension.html
 */
class ADExplorerExtension extends Extension
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}

我的捆绑服务:在AD\ExplorerBundle\Service

<?php
namespace App\AD\ExplorerBundle\Service;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\String\Slugger\SluggerInterface;

class FileUploader
{
    private $targetDirectory;
    private $slugger;

    public function __construct(string $targetDirectory, SluggerInterface $slugger)
    {
        $this->targetDirectory = $targetDirectory;
        $this->slugger = $slugger;
    }

    public function upload(UploadedFile $file): array
    {
        $originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
        $safeFilename = $this->slugger->slug($originalFilename);
        $fileName = $safeFilename.'-'.uniqid().'.'.$file->guessExtension();

        $result = array(
            'filename' => $fileName,
            'originalName' => $originalFilename,
            'extension' => $file->guessExtension()
                );

        try {
            $file->move($this->getTargetDirectory(), $fileName);
        } catch (FileException $e) {
            // ... handle exception if something happens during file upload
        }

        return $result;
    }

    public function getTargetDirectory()
    {
        return $this->targetDirectory;
    }
}

my config/services.yaml

parameters:
    locale: 'fr'
    doctrine_behaviors_translatable_fetch_mode: "LAZY"
    doctrine_behaviors_translation_fetch_mode: "LAZY"



imports:
    - { resource: '@ADCoreBundle/Resources/config/services.yml' }
    - { resource: './parameters.yaml' }

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'


    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

我的捆绑服务:在AD\ExplorerBundle\Resources\config\service.yaml中

parameters:
    brochures_directory: '%kernel.project_dir%/public/uploads'

services: 
    ad_file_uploader:         
        class: App\AD\ExplorerBundle\Service\FileUploader
        arguments:
            $targetDirectory: '%brochures_directory%'

我阅读文档:https://symfony.com/doc/current/bundles/extension.html

https://symfony.com/doc/current/service_container.html#manually-wiring-arguments

https://symfony.com/doc/current/service_container/autowiring.html

我真的不明白:

公共和可重用捆绑包»

公共捆绑包应明确配置其服务,而不依赖于自动连接。自动连接依赖于容器中可用的服务,捆绑包无法控制其包含的应用程序的服务容器。在公司内部构建可重用捆绑包时,您可以使用自动布线,因为您可以完全控制所有代码。

我认为这是可以的,因为这是我的捆绑包和我的应用程序,所以我完全控制代码。

所以,我测试了很多东西,但没有工作。

如果有人有主意,谢谢

共有1个答案

陶元凯
2023-03-14

Symfony建议在捆绑包中使用手动服务定义,主要是为了避免每次重建缓存时不断扫描捆绑包的开销。但我认为,看看使用autowire/自动配置创建一个潜在的可重用捆绑包实际上需要什么可能会很有趣。试图尽可能多地遵循捆绑包的最佳实践。

作为我自己的参考,我签入了一个完整的工作包示例。

最终,捆绑包应该放在自己的存储库中。但是,通过将包封装在应用程序中,可以更容易地开发包。这就是我使用的方法。但重要的是不要尝试将应用程序源代码与捆绑包源代码混用。这样做不仅具有挑战性,而且会使您很难将捆绑包复制到它自己的存储库中。

因此,我们从如下目录结构开始:

project # Symfony application project
    src: # Application source code
    explorer-bundle # AD Explorer Bundle source code
        ADExplorerBundle.php

正确使用名称空间也很重要。前缀确实应该是唯一的供应商ITIdentifier,以避免可能的命名冲突。在本例中,我们使用AD。当然,由于AD可能有多个bundle,我们进一步使用bundle特定的标识符进行细分。

namespace AD\ExplorerBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class ADExplorerBundle extends Bundle
{

}

为了让自动加载工作,我们调整了composer.json文件。一旦捆绑包转换成真正的作曲家包,就不再需要这一行了。当然,您必须将bundle类添加到project/config/bundles.php

# composer.json
    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "AD\\ExplorerBundle\\": "explorer-bundle/"
        }
    },
# run composer "dump-autoload" after making this change

现在我们需要一个扩展来加载bundle的services.yaml。它只是一个标准加载,所以不需要在这里显示代码。这是services.yamlhtml" target="_blank">文件的外观:

# explorer-bundle/Resources/config/services.yaml
parameters:
    # Cheating here, this would normally be part of the bundle configuration
    ad_explorer_target_directory: 'some_directory'

services:
    _defaults:
        autowire: true
        autoconfigure: true
        bind:
            $targetDirectory: '%ad_explorer_target_directory%'

    AD\ExplorerBundle\:
        resource: '../../*'
        exclude: '../../{DependencyInjection,Entity,Migrations,Tests,ADExplorerBundle.php}'

    AD\ExplorerBundle\Controller\:
        resource: '../../Controller'
        tags: ['controller.service_arguments']

为了简单起见,我只是将目标目录作为一个参数。您可能希望进行实际的捆绑配置,并让应用程序能够进行设置。但这超出了这个答案的范围。

为了进行测试,我选择创建一个命令。我发现这比尝试刷新浏览器更容易。

// Easier to debug an injected service using a command than a controller
class ExplorerAddCommand extends Command
{
    private $fileUploader;

    protected static $defaultName = 'ad:explorer:add';

    public function __construct(FileUploader $fileUploader)
    {
        parent::__construct();
        $this->fileUploader = $fileUploader;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        echo "Explorer Add " . $this->fileUploader->targetDirectory . "\n";
        return 0;
    }
}

就是这样。

 类似资料:
  • 当我运行服务器时。在同一台hazelcast客户端中,我可以看到我能够在同一台物理计算机上使用两个成员组成集群。但是,当我尝试使用以下代码使用相同的hazelcast生成一个新实例(在同一台物理机器上)时。xml配置文件(作为示例客户机正在使用的文件),我的服务器实例似乎没有加入samle客户机节点。我正在启动的服务器进程无法启动(我可以在visualvm中看到它)。我已经加入了- 服务器示例:

  • 当我对服务进行操作时,我收到了一个空指针异常,因为我的服务没有被Autowired到类中。我在这个应用程序中实现了与其他类完全相同的类的存储库和服务,我以前没有遇到过这个问题。事实上,这个类确实警告了Autowire的问题,但我不知道如何修复它们: 同样,这与其他类的设置相同,我没有这个问题。在服务类中,它抱怨存储库不能被带入构造函数,因为有多个相同类型的bean。我的另一个服务类也显示了这个警告

  • 问题内容: 我刚刚开始学习Node.js,并编写了最简单的服务器,如下所示: 和服务器: 我的问题是,第一次运行此代码时,它运行良好- CSS和js加载没有问题。但是后来我在同一台服务器上同时使用PHP和Node.js(使用nginx)进行了实验。我失败了,因为我不需要太多(这只是为了好玩),所以我放弃并更改了所有更改以实现此目标设置(例如nginx- conf中的端口)。然后,在尝试再次运行此代

  • 背景 当前有两个服务,分别是user-service和order-service,nacos服务列表中无法发现两个服务 排查 Nacos v2.2.3 依赖已引入,配置文件已配置addr 运行时未出现连接nacos的日志: 希望大佬们可以帮忙看看是什么问题 问题程序链接 https://oss-20001.oss-cn-qingdao.aliyuncs.com/cloud-demo.zip

  • 我刚开始在一个工作项目中工作。我试图为DB、Lumen等安装一组docker-compose服务器。当我尝试一些涉及artisan的命令(就像或)时,我会得到错误消息: 未添加任何memcached服务器 然后我去Laravel docs看看memcached缓存驱动程序是如何工作的,它说这是在中配置的。这个项目没有cache.php文件。另一方面,.env文件不包含CACHE_DRIVER环境变

  • 你好,作为角2学习项目的一部分,我正在创建一个测试应用程序。 我试图急切地加载一个名为的模块,但是,出现以下错误: 错误:(SystemJS)XHR错误(404未找到)加载http://localhost:3000/app/core.js错误:XHR错误(未找到404)加载http://localhost:3000/app/core.js在XMLHttpRequest。wrapFn[as _onr