Symfony 2.8:编译器传递动态容器参数并在 security.yml 中使用
Symfony 2.8 : dynamic containers parameters at compiler pass and used in security.yml
我在 Symfony 2.8 API 项目中遇到了一个我无法自行解决的问题:
我在我的一个包的 DependencyInjection 中的编译器传递中加载了一些参数:
class ParametersCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
//loads api version from database when container gets built.
$api_version = $container->get('doctrine')->getRepository('MyAppEntityBundle:Parameter')
->findOneBy(['name' => 'api_version']);
if (!$api_version) {
throw new MyAppException('api_version couldnt be found in database during container build process.');
}
$container->setParameter('api_version', $api_version);
}
}
我不想在 paramters_*.yml 文件中使用此参数,以确保始终从 db 检索它 + 我在 security.yml 文件中使用它,例如:
security:
firewalls:
api:
pattern: ^/api/%api_version%/
我怎样才能做到这一点?
显然,$container->setParameter('name', $value);如果 parameter_*.yml 文件中的参数在 parameters.yml 中没有虚拟值,则不起作用
+ 我需要在解析和加载 security.yml 之前设置这些值。
我研究了 symfony 核心几个小时,发现了从 kernel->boot() 进程加载安全配置的位置,但我不知道如何正确实现我想要的。
任何有关正确方法的帮助或提示将不胜感激:)
它可以工作,但我不知道这是否是一个好的做法...SecurityExtension 为每个防火墙请求匹配器创建一个动态服务并且 id 由 md5 和 sha1 加密...您可以覆盖参数.
查看 Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension
中的方法 createRequestMatcher
这显然不是一个好的做法,正如我在回应之前的评论时所说的那样,我承认,对于一个简单的 API 版本管理问题来说,它过于复杂了。我最终在 parameters.yml 文件中设置参数,因此当处理 security.yml 文件时,这不是问题,并将我的 API 管理逻辑放在 [=16= 的构建过程中].更有意义。
@Mocrates 非常感谢您的回答:)
我在 Symfony 2.8 API 项目中遇到了一个我无法自行解决的问题:
我在我的一个包的 DependencyInjection 中的编译器传递中加载了一些参数:
class ParametersCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
//loads api version from database when container gets built.
$api_version = $container->get('doctrine')->getRepository('MyAppEntityBundle:Parameter')
->findOneBy(['name' => 'api_version']);
if (!$api_version) {
throw new MyAppException('api_version couldnt be found in database during container build process.');
}
$container->setParameter('api_version', $api_version);
}
}
我不想在 paramters_*.yml 文件中使用此参数,以确保始终从 db 检索它 + 我在 security.yml 文件中使用它,例如:
security:
firewalls:
api:
pattern: ^/api/%api_version%/
我怎样才能做到这一点?
显然,$container->setParameter('name', $value);如果 parameter_*.yml 文件中的参数在 parameters.yml 中没有虚拟值,则不起作用 + 我需要在解析和加载 security.yml 之前设置这些值。 我研究了 symfony 核心几个小时,发现了从 kernel->boot() 进程加载安全配置的位置,但我不知道如何正确实现我想要的。
任何有关正确方法的帮助或提示将不胜感激:)
它可以工作,但我不知道这是否是一个好的做法...SecurityExtension 为每个防火墙请求匹配器创建一个动态服务并且 id 由 md5 和 sha1 加密...您可以覆盖参数.
查看 Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension
中的方法 createRequestMatcher这显然不是一个好的做法,正如我在回应之前的评论时所说的那样,我承认,对于一个简单的 API 版本管理问题来说,它过于复杂了。我最终在 parameters.yml 文件中设置参数,因此当处理 security.yml 文件时,这不是问题,并将我的 API 管理逻辑放在 [=16= 的构建过程中].更有意义。 @Mocrates 非常感谢您的回答:)