使用我現在面臨一個問題,我自己可以在我的Symfony 2.8 API項目未解決:Symfony的2.8:在編譯器傳遞的動態容器參數和security.yml
我有些放慢參數加載在編譯過程在我的包之一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 _ *陽明文件,以確保它總是從數據庫中檢索+我用它在security.yml文件,如:
security:
firewalls:
api:
pattern: ^/api/%api_version%/
我該怎麼做到這一點?顯然,$ container-> setParameter('name',$ value);如果在參數_ *。yml文件中沒有參數,並且在parameters.yml中有虛擬值,那麼它不起作用 +我需要在security.yml被解析並加載之前設置這些值。 我已經看了幾個小時的symfony核心,發現安全配置從kernel-> boot()進程加載,但我沒有看到如何實現我想要的東西。
上的正確方法任何幫助或提示將高度讚賞:)
所有的配置文件解析都是在調用任何pass之前完成的。所以,你會永遠需要一個虛擬的價值。與setParameter無關。你可以看看SecurityBundle如何傳遞它的服務,並可能改變你傳球中的定義。但是從通行證內部訪問數據庫是不尋常的。我懷疑它甚至會起作用。 – Cerad
防火牆的目標是什麼?如上所述,除非您重新編譯應用程序,否則使用編譯器pass將在編譯時'app/console cache:warmup'充當db值的緩存,並且在db值不會更改。這在生產中會令人困惑和不受歡迎。使用[安全提供程序](https://symfony.com/doc/2.8/security/api_key_authentication.html#only-authenticating-for-certain-urls)在訪問時驗證用戶更有意義,而不是在編譯時間。然後你可以執行你自己的查詢來驗證每個請求的'api_version'。 – fyrye
@Cerad,我從我的源代碼中刪除了這個,但是我確定它是可能的,也許是因爲運氣好的原則是在容器傳遞之前在容器中構建的?或者每個供應商的軟件包都是在我之前生成的對不起,這些都是假設。 好吧,我看到如何改變安全服務的定義,但它是複雜的,我想達到什麼,謝謝你的提示! – bohr