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

Symfony 4-来自自定义捆绑包的服务不起作用

秦育
2023-03-14

我将symfony 3迁移到symfony 4.3,并且我的自定义包移动到:src/Bundles/FooBundle。

structure FooBundle:-依赖注入-配置。php-FooExtension。php-Event-Model-Resources-config-services。yml-Service-Twig-Exception-FooBundle。php

和文件bundle/FooBundle/Resources/config/services。亚马尔

services:
  foo:
    class: App\Bundles\FooBundle\Service\Foo
    arguments:
      - '%foo.argument1%'
      - '%foo.argument2%'
      - '%foo.argument3%'
  foo.listener.example:
    class: App\Bundles\FooBundle\Event\Listener\ExampleListener
    arguments: ['@annotations.reader']
    tags:
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
  foo.filter:
    class: App\Bundles\FooBundle\Filter\FilterConverter
    tags:
      - { name: request.param_converter }

捆绑/脚束/依赖注射/Configuration.php

<?php

namespace App\Bundles\FooBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder('foo');
        $treeBuilder->getRootNode()
            ->children()
            ->scalarNode('argument1')->isRequired()->end()
            ->scalarNode('argument2')->isRequired()->end()
            ->scalarNode('argument3')->isRequired()->end()
            ->end();

        return $treeBuilder;
    }
}

Bundles/FooBundle/DependencyInjection/footextension。php

<?php

namespace App\Bundles\FooBundle\DependencyInjection;

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

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

        $container->setParameter('foo.argument1', $config['page_field_name']);
        $container->setParameter('foo.argument2', $config['per_page_field_name']);
        $container->setParameter('foo.argument3', $config['sort_field_name']);

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

和bundle注册:config/bundles。php

App\Bundles\FooBundle\FooBundle::class => ['all' => true],

配置包:

config/packages/foo。山药

foo:
  argument1: test1
  argument2: test2
  argument3: test3

完成了...运行应用程序和错误:无法自动连接服务"App\Bundles\FaBundle\Service\Foo":方法"__construct()"的参数"$agument1"没有类型提示,您应该显式配置其值。

但是,当我在config/services中添加conf时。亚马尔:

App\Bundles\FooBundle\Service\Foo:
  arguments:
    - '%foo.argument1%'
    - '%foo.argument2%'
    - '%foo.argument3%'

那工作。。。

问:为什么捆绑服务不起作用?

共有1个答案

白镜
2023-03-14

我想问题在于symfony中的默认配置将自动连线添加到应用程序名称空间下的所有类。

检查config/services下的配置。yml

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.

    # 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/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

您可以删除以下行:

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

问题应该会消失。

 类似资料:
  • 我正在尝试建立一个混合AngularJS Angular应用程序,它使用Webpack作为模块加载程序,Karma Jasmine作为测试框架。为了运行测试,我正在使用;但是,webpack创建的包从未加载到浏览器中,因此测试从未执行(duh!)。我试过很多方法来检查是否正常,但我在其他网站上都没有发现这个问题。 所以,一点调试信息。首先,我的文件: 运行Karma时,webpack执行成功(pr

  • 问题内容: 我已经为此花了好一会儿,想知道是否有可能从头开始。感谢您对此的任何帮助! npm包 我有一个npm包,它基本上是一个React组件库。该库具有嵌入式样式表,该样式表引用了CSS中的资源,例如字体和图像。然后将所有这些都使用webpack捆绑到中。 的配置如下所示: 随着看起来像: 到目前为止,一切都很好。 应用程序 现在,在另一个代码库中,我有了主应用程序,该应用程序安装了该npm软件

  • 我正在尝试创建自己的android Asynctask实现。为此,我创建了一个抽象类,它扩展了Thread类。我为onPreExecute、onPostExecute、onProgressUpdate和doInBackground声明了方法。 我通过从主线程的循环器创建一个处理程序来运行doInBackground方法。但我无法修改onProgressUpdate()方法中的UI元素,但我可以修改

  • 我正在尝试使用cq中的OSGI包创建自定义标记库。实际上,我创建了所有必要的文件,但我无法放置mytags。生成时META-INF文件夹下的tld文件。为此,我使用了maven bundle插件。这是我的代码,用于将资源包含在META-INF文件夹中 注意:我已将标记文件放在“src\main\resources\META-INF\myTags”下 我使用了<代码> 这是我的生成错误 [错误]捆绑

  • 我制作了一个简单的API包,它将在项目之间共享。每个对象/实体都有自己的配置,说明哪些字段以及如何序列化(分解为标量值)。它们将如何序列化取决于所选的规范化程序。现在只有一个默认的规范化器可以将值识别为标量、iterable或object。到目前为止效果很好。当您需要一些特定的序列化(比如DateTime)时(您不希望将对象分解为隐式标量值,而是设置输出格式),您只需要创建一个新的规范化器来相应地

  • 我想制作某种代理(可能是windows服务),它将在服务器的后台运行,并在Azure服务总线中公开一个endpoint。 我在Azure中有一个worker角色,每天向代理内部发送一条消息,代理将向内部服务发出一个web请求并返回一些数据。 问题是座席将在不同的客户处所运行...工作人员角色如何向正确的客户座席服务发送消息并进行呼叫? 我猜也许主题和订阅会起作用?