首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据服务在服务包中的配置将服务转化为服务

根据服务在服务包中的配置将服务转化为服务
EN

Stack Overflow用户
提问于 2019-02-02 10:09:18
回答 1查看 71关注 0票数 1

我正忙着把我的第三方包从symfony 3移植到symfony 4,我在这个包里有自己的服务。让我们称它为MyService:

代码语言:javascript
运行
复制
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;

class MyService
{
    private $params;
    private $userChecker;

    function __construct( ParameterBagInterface $params,
                          UserCheckerInterface  $userChecker )
    {
        $this->params = $params;
        $this->userChecker = $userChecker;
    }

    // ...
}

第二个注入'UserCheckerInterface‘有问题,它必须注入另一个容器服务,这取决于我的包配置

MyBundle/DependencyInjection/Configuration.php:

代码语言:javascript
运行
复制
class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('fbeen_user');

        $rootNode
            ->children()
                ->scalarNode('user_checker')->defaultValue('@security.user_checker.main')->end()
            ->end()
        ;

        return $treeBuilder;
    }

}

最后,在我的包中,services.yaml:

代码语言:javascript
运行
复制
services:
    _defaults:
        bind:
            $userChecker: '@security.user_checker.main'

    my_bundle.my_service:
        class: MyCompany\MyBundle\Service\MyService
        arguments: ['@parameter_bag'] 
        public: true

这是可行的,但如果我将_defaults: bind部分从包的service.yaml移动到第三方包之外的主service.yaml,而不是第三方包,这意味着使用我的第三方包的任何人仍然不能使用另一个userChecker。我试过这样的方法:

代码语言:javascript
运行
复制
services:
    _defaults:
        bind:
            $userChecker: '@%mycompany_mybundle.user_checker%'

但是它提供一个字符串作为结果,而不是一个实例。有人给我线索了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-02 12:55:22

必须在扩展类中配置服务。

代码语言:javascript
运行
复制
<?php

namespace MyBundle\DependencyInjection;

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

class MyBundleExtension extends Extension 
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

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

        $definition = $container->getDefinition('my_bundle.my_service');
        $definition->replaceArgument(1, new Reference($config["user_checker"]));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54491996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档