2017-10-07 67 views
0

使用我現在面臨一個問題,我自己可以在我的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()進程加載,但我沒有看到如何實現我想要的東西。

上的正確方法任何幫助或提示將高度讚賞:)

+2

所有的配置文件解析都是在調用任何pass之前完成的。所以,你會永遠需要一個虛擬的價值。與setParameter無關。你可以看看SecurityBundle如何傳遞它的服務,並可能改變你傳球中的定義。但是從通行證內部訪問數據庫是不尋常的。我懷疑它甚至會起作用。 – Cerad

+1

防火牆的目標是什麼?如上所述,除非您重新編譯應用程序,否則使用編譯器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

+0

@Cerad,我從我的源代碼中刪除了這個,但是我確定它是可能的,也許是因爲運氣好的原則是在容器傳遞之前在容器中構建的?或者每個供應商的軟件包都是在我之前生成的對不起,這些都是假設。 好吧,我看到如何改變安全服務的定義,但它是複雜的,我想達到什麼,謝謝你的提示! – bohr

回答

1

這顯然不是一個很好的做法,正如我在迴應之前的評論說,我承認這一點,這是矯枉過正複雜的簡單的API版本管理問題。我最終在parameters.yml文件中設置了參數,所以在處理security.yml文件時,這不是問題,並且將我的API管理邏輯放置在CI的構建過程中。更有意義。 @Mocrates非常感謝您的回答:)

1

它可以工作,但我不知道是否是一個很好的做法......一個SecurityExtension創建每個防火牆的要求匹配的動態服務和該ID由md5和sha1加密......您可以覆蓋參數。

看到的Symfony \包\ SecurityBundle \ DependencyInjection \ SecurityExtension的方法createRequestMatcher

+0

*移動回答關閉問題* – bohr

+0

我同意,對我來說最好的解決方案是在配置文件 – Mocrates