2016-02-07 30 views
1

在Symfony中使用編譯器通行證有什麼意義?使用擴展類時,在Symfony中使用編譯器傳遞?

當我們應該使用擴展類和編譯器通過Symfony時?

+0

http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html&http://symfony.com/doc/current/cookbook/bundles/extension .html#created-an-extension-class –

+2

這些鏈接說的是如何,不是爲什麼,什麼時候。無論如何感謝回覆。 –

回答

3

它們帶有服務定義。

通過創建編譯器通道,您可以更新傳遞給服務的參數。

它最常用標記服務完成。

而且,它可用於:

  • 創建要求有關被定義之前,其他定義的服務信息的新服務。

  • 將參數交換或添加到您未寫入的服務。

  • 創建和修改容器中的參數。

我用一個編譯器通過註冊一個工廠,使我能夠重寫教條庫。

你可以看到代碼,它是如何工作更多的理解:

https://gist.github.com/chalasr/77be8eee5e3ecd3c06ec

更新

感謝對@Sruj,我說我已經忘記了Extension

部分

Extension也是依賴注入的一部分,尤其是配置。
它的主要作用是在整個應用程序包中加載服務配置。

而不是使用imports手動加載您的配置,您可以創建一個擴展程序,爲您做。您的所有服務配置都從您的軟件包中註冊並在您的整個應用程序中共享。

當您在應用程序配置中註冊供應商時,會調用供應商的服務容器擴展。

查看文檔的"Importing configuration via container extensions"部分

+0

我更新了我的答案 – chalasr

+0

我接受你的答案,但我仍然需要深入挖掘擴展,因爲此外加載和註冊配置擴展可能做得更多,就像在這裏https://github.com/FriendsOfSymfony/FOSRestBundle/blob /master/DependencyInjection/FOSRestExtension.php或在這裏https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/DependencyInjection/FOSElasticaExtension.php或這裏https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/DependencyInjection/FOSUserExtension。php –

+1

鏈接中的所有代碼都包含到服務配置的加載中。通過設置加載服務的參數和定義,命名/組織它們,它也理解成爲配置的一部分。編譯器pass之間的主要區別在於它允許更新您未編寫的已配置服務。 – chalasr

相關問題