Symfony 4是一款出色的产品,但我无法理解依赖注入以及如何在我的服务中实际获取数据。所以我会问一个简单的问题,看看答案是否对我有帮助。
在security.yaml文件中的我在encoders部分定义了一个编码。它看起来像
security:
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 15
问题:在我的控制器App \ Controller \ UserController中,我需要注入什么才能读取成本值?它不是编码,因为它只有一个私有的成本价值,而不是公开的。
谢谢,
克雷格
答案 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都不会警告您未设置的值,然后您的代码可能会破坏或表现得很奇怪,因为该值不是您所期望的。