我遇到了一个问题,我无法在Symfony 2.8 API项目中自行解决:
我在我的一个bundle的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);
}
}
我不希望在参数_ *。yml文件中使用此参数,以确保它始终从db +中检索到我在security.yml文件中使用它,例如:
security:
firewalls:
api:
pattern: ^/api/%api_version%/
我怎样才能实现这一目标?
显然,$ container-> setParameter(' name',$ value);如果参数_ *。yml文件中的参数在parameters.yml中具有虚拟值,则不起作用 +我需要在解析和加载security.yml之前设置这些值。 我已经研究了几个小时的symfony核心,发现了从kernel-> boot()过程加载安全配置的地方,但我没看到如何正确实现我想要的。
任何有关正确方法的帮助或提示都将受到高度赞赏:)
答案 0 :(得分:1)
它可以工作,但我不知道是否是一个好的做法...... SecurityExtension为每个防火墙请求匹配器创建一个动态服务,id由md5和sha1加密...你可以覆盖参数。
在Symfony \ Bundle \ SecurityBundle \ DependencyInjection \ SecurityExtension中查看方法createRequestMatcher
答案 1 :(得分:1)
这显然不是一个好的做法,正如我在回答之前的评论时所说的那样,我承认,对于简单的API版本管理问题来说,复杂性太大了。我最终在parameters.yml文件中设置参数,所以当处理security.yml文件时,它不是问题,并将我的API管理逻辑放在CI的构建过程中。更有意义。 @Mocrates非常感谢您的回答:)