2011-12-28 62 views
3

我正在尋找關於如何構建Symfony 2.0應用程序的最佳實踐的一些指導。如果我有幾個捆綁包(Cart Bundle,Product Bundle,CMS Bundle),並且我希望在編寫頁面時使用所有這些捆綁包的各個方面,我應該如何最好地執行此操作?Symfony捆綁組合,我如何在使用多個捆綁包時構造我的代碼

我可以想象兩種方法來做到這一點,但我正在尋找哪些(如果有的話)是正確的指導。

1)通過服務公開我捆綁的所有功能,並使這些服務可以直接在樹枝中使用。通過這種方式,我可以將我的路由請求傳遞給最合適的包(因此http://myclient.org/User/Account)被傳遞給ClientUser包以進行處理,但導航中具有迷你購物車的基本模板能夠直接從內部訪問它需要的信息樹枝(我不需要通過這個)

2)創建一個訪問所有其他包以建立頁面(如VendorFrontend或VendorBackend)的包。這意味着所有的路由請求都會被傳遞給這個包,並且這個包在傳遞給模板之前會訪問頁面每個部分所需的信息。

第一個選項感覺不對,因爲我不確定是否可以讓Twig直接使用服務(雖然服務容器)?

第二個選項感覺不對,因爲它就像使用第二個路由器一樣,路由將被傳遞到一個捆綁包中,該捆綁包僅存在於組合其他捆綁包中(這裏給出的是該捆綁包緊密地耦合到捆綁包使用)。這當然違背了代碼可重用的'捆綁'的概念。

在這個例子中,我試圖構建一個非常簡單的電子商務網站,僅用於演示目的。我有一個基本模板,將有一個主導航,迷你購物車,'身體'和頁腳。我將它存儲在/ app/Resources目錄中。我打算讓所有其他模板繼承這個模板並覆蓋「body」區域。

不想spoon,,只是在正確的方向微調。謝謝。

+0

剛看到一個很老的問題upvote。答案是在適當的地方使用子請求,並在適當的地方使用樹枝擴展。上面討論的第二個選項在您的應用程序開始增長時甚至不是一個可行的選項。它也可怕地耦合到個人捆綁。 TL; DR。 1 – calumbrodie 2013-06-13 20:15:57

回答

1

我認爲重要的是擺脫這樣的想法,爲了生成一個「頁面」,必須將所涉及的模板可能需要渲染的所有變量彙集在一起​​,然後將這些變量傳遞給一個模板。一個控制者應該只爲它所服務的請求做特定的事情,不要再做。因此,如果某個特定產品在某個網址中引用了該網址,請抓取該產品並將其傳遞到模板中。如果有一個特定的產品被引用但它不存在,或者不應該顯示,那麼您以404/410 /適當的方式迴應。如果存在特定的集合,則獲取集合並將其傳入。路由/控制器應解碼請求 - URL本身,HTTP方法等 - 並將其轉換爲特定的東西。一般而言並非特定於某個特定請求的東西不屬於那裏。

同樣重要的是,我會說,儘可能地抽象您可以使用從樹枝模板使用的包。我主張更多地將模板「拉」到需要的內容中,而不是被推入,但這是通過定義捆綁中的Twig函數來實現的,它們本身可以通過DI容器將數據綁定到可能或不可能在當前的請求中,等等。因此,您可以創建一個Twig函數,它可以將任何可能更改的參數作爲參數 - 如果它與產品類別有關,則讓它將產品類別對象作爲參數。

基本上答案是更多1)比2),但你不應該直接通過Twig訪問服務 - 你應該通過函數進行代理,這些函數可以在模板中產生語義意義,它們本身被定義爲將服務注入到他們在運行時,您可以隨意在您包含或寫入的任何新捆綁包中定義不同的服務。

+0

具體示例。如果我訪問產品路線,則使用ClientProductBundle提供此請求。我的軟件包將獲取產品對象並將其傳遞給我的模板(該模板也駐留在ClientProductBundle中)。該模板從/ app/Resources擴展基本模板。我在什麼階段訪問我需要訪問的「ClientCart」捆綁包,以顯示用戶購物車中的物品數量?我能看到做到這一點的唯一方法是讓我的基本模板能夠直接訪問它。否則,我無法弄清楚(在執行路徑中)我訪問ClientCart軟件包 – calumbrodie 2011-12-28 13:58:28

+0

編輯:您是否說我的方法(1)是正確的,但我應該間接訪問購物車服務?在這種情況下,我將如何做到這一點(從樹枝)? – calumbrodie 2011-12-28 14:00:39

+0

[這個問題]的答案(http://stackoverflow.com/questions/8450465/fetching-data-through-a-custom-repository-in-a-twig-extension)是否能夠幫助你?在顯示用戶購物車中物品的數量的情況下,您可以定義一個名爲cart_item_count()的樹枝函數,並將其定義爲使用購物車訪問服務訪問計數。重點是購物車的物品數量是特定於當前的會話,而不是特定於當前的請求,所以從控制器傳遞購物車信息是沒有意義的。 – 2011-12-28 14:20:40