14

サービスにオプションのサービス依存関係を追加できることを知っています。構文は次のとおりです。

arguments: [@?my_mailer]

しかし、サービスのオプションのパラメーター依存関係を追加するにはどうすればよいですか?

arguments: [%my_parameter%]

私は試した

arguments: [%?my_parameter%]
arguments: [?%my_parameter%]

しかし、どちらも機能しません。この機能は sf2 に実装されていますか?

4

3 に答える 3

13

Symfony 2.4 から、これに式を使用できます。

引数: ["@=container.hasParameter('some_param') ? parameter('some_param') : 'default_value'"]

詳細はhttp://symfony.com/doc/current/book/service_container.html#using-the-expression-languageをご覧ください

于 2014-10-14T22:56:44.893 に答える
8

パラメータを渡さない/設定しないと、Symfony はサービスの依存関係について文句を言うと思います。config.yml ファイルで常に設定する必要がないように、パラメータをオプションにします。そして、設定されているときはいつでもそのパラメーターを使用したいと考えています。

私の解決策があります:

# src/Acme/HelloBundle/Resources/config/services.yml
parameters:
    my_parameter:

services:
    my_mailer:
        class:        "%my_mailer.class%"
        arguments:    ["%my_parameter%"]

その後

# you-bundle-dir/DependencyInjection/Configuration.php

public function getConfigTreeBuilder()
{
    $treeBuilder = new TreeBuilder();

    $rootNode = $treeBuilder->root('you_bundle_ns');

    // This is for wkhtmltopdf configuration
    $rootNode
            ->children()
            ->scalarNode('my_parameter')->defaultNull()->end()
            ->end();

    // Here you should define the parameters that are allowed to
    // configure your bundle. See the documentation linked above for
    // more information on that topic.

    return $treeBuilder;
}

その後

# you-bundle-dir/DependencyInjection/YourBundleExtension.php

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

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


    $container->setParameter(
        'you_bundle_ns.your_parameter',
        isset($$config['you_bundle_ns']['your_parameter'])?$$config['you_bundle_ns']['your_parameter']:null
    );
}

「%parameter%」にデフォルト値を指定して、パラメータをオプションにします

より良い代替手段があれば教えてください。

于 2013-06-28T01:53:19.120 に答える
-2

パラメータのデフォルト値を設定しようとしましたか? そのようです:

namespace Acme\FooBundle\Services;

class BarService
{
    public function __construct($param = null)
    {
        // Your login
    }
}

何も注射していません。

于 2012-09-30T22:30:33.147 に答える