簡體   English   中英

Symfony2 bundle繼承丟失父包路由

[英]Symfony2 bundle inheritance losing parent bundles routes

我正在嘗試按照此處的說明創建一個簡單的bundle繼承,並遇到路由問題。 我正在使用注釋進行路由。 當我在AppKernel.php中注冊我的子包時,我的所有父包路由都將丟失。

根據我從文檔中理解的內容,Symfony2應首先從子包中查找所有文件,包括路由,然后從父包中查找。 現在沒有發生,只有子捆綁控制器似乎被加載。

在我的子包Bundle文件中,我按照指示實現了getParent函數,在我的routing.yml中,我有:

ParentBundle:
resource: "@Parent/Controller/"
type:     annotation
prefix:   /admin/

在繼承之前工作得很好。

我已經測試過系統工作正常,如果在routing.yml中包含所有控制器文件,但這似乎是非常麻煩的方式使繼承工作,因為我只想覆蓋父包的幾個部分(不是所有控制器)。

Profiler將我的兩個捆綁包顯示為活動狀態。

我找到了解決這個問題的正確方法。 今天我還試圖覆蓋配置了注釋路由的父包,並且如果anotation routing導入整個包(“@ SomeBundle / Controller”),也發現父路由被忽略。

經過一些調試后,我發現對此的解釋是,如果你使用“@”作為控制器的前綴,這將傳遞給內核解析器,如果父資源被覆蓋,它將僅返回子資源。 因此,解決方案是提供bundle的完整路徑,考慮到內核將嘗試匹配app / Resources中的資源,因此您必須在實際路徑之前添加相對目錄(../../):

# app/config/routing.yml:
some_parent:
    resource: "../../src/Application/ParentBundle/Controller"
    type: annotation

# ChildBundle implements getParent() method to inherit from ParentBundle
some_child:
    resource: "@ChildBundle/Controller"
    type: annotation

這將按預期工作:將導入所有父路由,並將被子捆綁中指定的所有路由覆蓋。

除了之前的回答,我還必須更改子包的routing.yml的名稱(例如,更改為routing_child.yml)以使其正常工作。 我假設這是因為如果名稱相同,Symfony完全忽略父包路由文件。

編輯:在許多情況下,將父包路由導入子包路由文件也是可行的,如下所示:

# routing_child.yml     
_parent:
    resource: "@MyParentBundle/Resources/config/routing.yml"

官方文檔說您只需將父路由文件復制到您的子包:

“覆蓋”捆綁包路由的最簡單方法是永遠不會導入它。 不要導入第三方軟件包的路由,只需將該路由文件復制到應用程序中,修改它,然后導入它。

此外,您不能使用符號名稱“@ParentBundle”包含父代的包路由文件,因為此名稱已解析為“@ChildBundle”。

如果你真的想要包含父路由文件,那么你應該使用相對於當前目錄的那個文件或路徑的絕對路徑,即:

# @YourChildBundle/Resources/routing.yml
YourParentBundle:
  resource: "/srv/www/example.com/src/Your/ParentBundle/Resources/routing.yml"

要么

# @YourChildBundle/Resources/routing.yml
YourParentBundle:
  resource: "../../../../../Your/ParentBundle/Resources/routing.yml"

另一種解決方法是將父路由文件符號鏈接到子包中,並將其包含在更短的路徑中,即:

cd YourChildBunde
ln -s ../../../../../Your/ParentBundle/Resources/routing.yml parent_routes.yml

接着

# @YourChildBundle/Resources/routing.yml
YourParentBundle:
  resource: "parent_routing.yml"

PS我希望他們能找到一些更好,更不方便的方法來覆蓋和擴展父包的路由,但現在我們必須解決一些丑陋的變通方法。

使用bundle繼承,您可以覆蓋父bundle的文件。

如果在捆綁包中的父項所在的位置創建路由文件(如果父文件的路由位於ParentBundle / Resources / config / routing.yml,則在ChildBundle / Resources / config / routing創建路由文件.yml),它將覆蓋父級的routing.yml,而symfony只會使用子級的routing.yml。

我沒試過,但是如果你在子包的routing.yml中導入父包的routing.yml,你可以解決你的問題。 由於Symfony路由器將始終選擇它找到的第一個匹配路由,您可以通過在導入代碼之上編寫相關路由代碼來覆蓋所需的特定路由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM