[英]Symfony2 optional ordered parameters
因此,我們遇到了這種情況,這種奇怪和不必要的情況,但是我們的SEO團隊想要它,因此我們必須接受。
我們需要將搜索過濾器作為URL的一部分傳遞,而不僅僅是查詢字符串(這顯然是很正常的事情)。
假設我們有三個過濾器
gender
age
和location
好吧,就像在任何使用過濾器的搜索中一樣,我們不能啟用所有過濾器,也不能啟用所有過濾器。
在正常情況下,這應該是/search?gender=female&age=25&location=london
,在我們奇怪的情況下,它應該是/search/female/25/london
但是正如我說的,我們可以全部擁有或不擁有/search
將是/search
(是)
這很簡單,只需一個具有SearchAction($gender, $age, $location)
和路由/search/{gender}/{age}/{location}
的Controller
但可以說,我們只想搜索female
和london
哎呀! 我們的路由,控制器和操作無法滿足我們的需求,因為需要{age}
,而我們沒有使用它。
如果我們嘗試搜索位於london
25 age
且age
在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.