簡體   English   中英

Symfony2可選有序參數

[英]Symfony2 optional ordered parameters

因此,我們遇到了這種情況,這種奇怪和不必要的情況,但是我們的SEO團隊想要它,因此我們必須接受。

我們需要將搜索過濾器作為URL的一部分傳遞,而不僅僅是查詢字符串(這顯然是很正常的事情)。

假設我們有三個過濾器

gender agelocation

好吧,就像在任何使用過濾器的搜索中一樣,我們不能啟用所有過濾器,也不能啟用所有過濾器。

在正常情況下,這應該是/search?gender=female&age=25&location=london ,在我們奇怪的情況下,它應該是/search/female/25/london

但是正如我說的,我們可以全部擁有或不擁有/search將是/search (是)

這很簡單,只需一個具有SearchAction($gender, $age, $location)和路由/search/{gender}/{age}/{location}Controller

但可以說,我們只想搜索femalelondon

哎呀! 我們的路由,控制器和操作無法滿足我們的需求,因為需要{age} ,而我們沒有使用它。

如果我們嘗試搜索位於london 25 ageage在25 age無性別人群,我們也會遇到同樣的問題,這同樣行不通,我們需要{gender} /search/25/london

當然,我們不希望能夠加載/search/25/london/female因為我們希望在過濾器中添加一個訂單,但為了避免重復,所以我們沒有重復的內容,您知道,SEO東西...

所以這就是我們的情況,我們需要一個控制器的動作,該動作可以處理n參數(到現在為止我們已經計數了5個),這些參數將成為我們的搜索過濾器,並以特定順序但同時是可選的...

因此,現在對此有所遺漏。 我們已經定義了我們想要的順序,我們想要的過濾器,並且我們希望它們是可選的,所以“簡單”的事情是我們知道第一個參數將始終是{gender}但它可以是可選的,因此如果為null我們將在數據庫查詢中將其忽略。

我不提供代碼,因為我們所做的甚至都沒有達到我們的目標,它只是一組可選參數和一堆無用的代碼,只是草稿而已。

我們可以針對每種情況進行路由,並在缺少參數的情況下讓層次結構對其進行處理,但是當然,我要問的是,是否存在一種使用盡可能少的行來做到這一點的可行且美觀的方法,因為您知道,代碼必須保持良好狀態。

在過去,我通過以下方式解決此問題:

/search/gender/{gender}/age/{age}/location/{location} 

也可以接受null->任何值,例如:

 /search/gender/male/age/any/location/london

希望這個幫助

如果您確實需要這樣做(您說對了,這聽起來很不好),那么我將按照您認為正確的方式構建它(使用可選參數-我們稱其為searchAction ),然后針對每種可能的情況創建一個操作,使用內部轉發定向到searchAction

例如,您可能有一條路線定義為search/{gender}/{age} ,並且僅在age為整數時才匹配。 然后,在此操作內,您可以轉發到主搜索,將操作中的參數作為參數傳遞給searchAction

return $this->forward(
  'MyBundle:Search:search', [], ['gender' => $gender, 'age' => $age]
);

然后重復/search/{gender}/{age}/{location}/search/{gender}/{location}等。

可能從另一邊接近會更簡單。 對於沒有搜索詞的情況,您可以將搜索路徑設置為“ / search / allGender / allAge / allLocation”。 如果用戶要搜索25歲,它將是'/ search / allGender / 25 / allLocation'...只需忽略數據庫查詢中的“保留”字詞(“ allGender”,“ allAge”,“ allLocation”)即可。 SEO團隊將對此解決方案感到滿意,並且很容易實現

暫無
暫無

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

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