使用附加服务扩展捆绑包

extending a bundle with additional services

我正在尝试延长 akeneo/MeasureBundle via the method described here。我已经向 MeasureManager 添加了几个方法,并添加了编译器传递以用我的 MeasureManager 版本替换原始版本。这一切都有效。

我还创建了一些自定义表单类型:UnitFamiliesTypeMeasurementTypeUnitType。我希望这些成为服务,所以我将它们放入我的 services.yml 文件中,如下所示:

services:
  acrdMeas.form.measurement.type:
    class: ACRD\MeasureBundle\Form\Type\MeasurementType
    scope: prototype
    arguments: [ "@akeneo_measure.manager" ]  
    tags:
      - { name: form.type, alias: acrdMeas_measurement }
  acrdMeas.form.unitfamilies.type:
    class: ACRD\MeasureBundle\Form\Type\UnitFamilyType
    arguments: ["@akeneo_measure.manager"]
    tags:
      - { name: form.type, alias: acrdMeas_unitfamilies }
  acrdMeas.form.units.type:
    class: ACRD\MeasureBundle\Form\Type\UnitFamilyType
    arguments: ["@akeneo_measure.manager"]
    tags:
      - { name: form.type, alias: acrdMeas_units }

不幸的是,当我 运行 app/console container:debug 时,这些表单类型没有显示为服务。尝试使用其中任何一个创建表单都会导致 "Could not load type ..." 错误。我确实通过 new 直接实例化它们来测试表单类型并且工作正常。

事实证明,扩展 BundleExtension 文件是可行的:

namespace ACRD\MeasureBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader;
use Akeneo\Bundle\MeasureBundle\DependencyInjection\AkeneoMeasureExtension as Extension;

class ACRDMeasureExtension extends Extension {

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

我不是很清楚为什么子 load() 方法不会破坏 parent::load(),但它不会。但希望这对某人有所帮助。