读取控制器/服务中的编码器成本值

时间:2018-01-06 03:08:57

标签: symfony dependency-injection

Symfony 4是一款出色的产品,但我无法理解依赖注入以及如何在我的服务中实际获取数据。所以我会问一个简单的问题,看看答案是否对我有帮助。

在security.yaml文件中的

我在encoders部分定义了一个编码。它看起来像

security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt
            cost:      15

问题:在我的控制器App \ Controller \ UserController中,我需要注入什么才能读取成本值?它不是编码,因为它只有一个私有的成本价值,而不是公开的。

谢谢,

克雷格

1 个答案:

答案 0 :(得分:0)

如果您想重复使用成本值,可以在services.yaml中创建一个参数:

parameters:
    encoder.cost: 15

然后在security.yaml:

中使用此参数
security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt
            cost:      %encoder.cost%

在控制器中,您可以根据需要调用getParameter()重复使用该值。更好的是直接将参数提供给您想要使用它的服务。

如果你看the sorce code for the BcryptPasswordEncoder - 对于传递给其他编码器的选项可能也是如此 - 该值不会公开。那是因为你的应用程序对编码器使用的成本无关紧要,因此依赖它会“错误”。

您可以使用反射或Closure::bind()来公开值,但我不会这样做,尤其是在生产代码中。唯一的其他方法是创建一个基于原始的自定义编码器并在那里公开,如果你有一个引人注目的用例重用该值。

另一个重要的事情是,您在配置中提供的值(例如security:framework:doctrine:通常会封装到服务中,除了绑定它们之外不可用到如上所示的参数并重复使用它们。它们通常甚至不被设置为容器内的参数。这是有充分理由的,如果配置发生变化,无论出于何种原因,您不希望应用程序的其他部分现在依赖它们中断。因此,使用自定义参数或有时甚至复制值以确保更新/更改不会产生不必要的副作用更安全。在控制器中使用这些值甚至参数也是如此。大多数IDE都不会警告您未设置的值,然后您的代码可能会破坏或表现得很奇怪,因为该值不是您所期望的。