Symfony2:如何在服务中注入所有参数?

2022-08-30 15:26:59

如何在服务中注入所有参数?

我知道我可以做到:这将传递给服务__construct。arguments: [%some.key%]parameters: some.key: "value"

我的问题是,如何注入服务中的所有内容?parameters

我需要这个来制作导航管理器服务,其中根据所有配置条目的不同设置生成不同的菜单/导航/痕迹导航。

我知道我可以根据需要注入任意数量的参数,但是由于它将使用其中的一些参数并且会随着时间的推移而扩展,因此我认为最好在开始时传递整个参数。

另一种方法可能是,如果我可以在服务中获取参数,就像在控制器中所做的那样,但我认为这将违背依赖注入的想法?$this -> container -> getParameter('some.key');

提前致谢!


答案 1

将整个容器注入到服务中不是一个好的做法。此外,如果您的服务需要许多参数,那么将它们逐个注入到您的服务中是不好的。相反,我使用此方法:

1)在config.yml中,我定义了我的服务所需的参数,如下所示:

 parameters:
    product.shoppingServiceParams:
        parameter1: 'Some data'
        parameter2: 'some data'
        parameter3: 'some data'
        parameter4: 'some data'
        parameter5: 'some data'
        parameter6: 'some data'

2)然后我将此根参数注入我的服务,如下所示:

services:
  product.shoppingService:
    class: Saman\ProductBundle\Service\Shopping
    arguments: [@translator.default, %product.shoppingServiceParams%]

3)在五月服务中,我可以访问这些参数,例如:

namespace Saman\ProductBundle\Service;

use Symfony\Bundle\FrameworkBundle\Translation\Translator;

class Shopping
{   
    protected $translator;
    protected $parameters;

    public function __construct(
        Translator $translator, 
        $parameters
        ) 
    {
        $this->translator = $translator;
        $this->parameters = $parameters;
    }

    public function dummyFunction()
    {
        var_dump($this->getParameter('parameter2'));
    }

    private function getParameter($key, $default = null)
    {
        if (isset($this->parameters[$key])) {
            return $this->parameters[$key];
        }

        return $default;
    }  
}

4)我还可以为不同的环境设置不同的值。例如,在 config_dev.yml 中

 parameters:
    product.shoppingServiceParams:
        parameter1: 'Some data for dev'
        parameter2: 'some data for dev'
        parameter3: 'some data for dev'
        parameter4: 'some data for dev'
        parameter5: 'some data for dev'
        parameter6: 'some data'

答案 2

另一个变体如何轻松获取参数 - 您只需将参数包设置为您的服务即可。您可以通过不同的方式执行此操作 - 通过参数或通过集合方法。让我用集合方法展示我的例子。

因此,在 services.yml 中,您应该添加如下内容:

my_service:
    class: MyService\Class
    calls:
        - [setParameterBag, ["@=service('kernel').getContainer().getParameterBag()"]]

在类 MyService\Class 中,只需添加用法:

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

并创建 2 种方法:

/**                                                                                                                                                                      
 * Set ParameterBag for repository                                                                                                                                       
 *                                                                                                                                                                       
 * @param ParameterBagInterface $params                                                                                                                                  
 */
public function setParameterBag(ParameterBagInterface $params)
{
    $this->parameterBag = $params;
}

/**                                                                                                                                                                      
 * Get parameter from ParameterBag                                                                                                                                       
 *                                                                                                                                                                       
 * @param string $name                                                                                                                                                   
 * @return mixed                                                                                                                                                        
 */
public function getParameter($name)
{
    return $this->parameterBag->get($name);
}

现在你可以在课堂上使用:

$this->getParameter('your_parameter_name');

推荐