2013-11-21 83 views
0

我的行動的定義如下:CakePHP路由器:如何傳遞第一個參數爲null?

function actionName($par1 = null, $par2 = null) 

我需要一個特殊的路徑看起來像:example.com/r/ABCD這應該叫

SomeController->actionName(null, "ABCD") 

它是如何與蛋糕的實現Router :: connect()?

+1

我不認爲這是可能的默認蛋糕路由功能。你應該首先避免這種情況。 ps,請始終提及您的確切CakePHP版本! – ndm

+0

如果你的第一個參數是NULL,那麼聽起來你的參數可能會被重新排序。 –

回答

1

你可以嘗試扭轉PARAMS像

function actionName($par2 = null, $par1 = null) 
+1

如果我只想傳遞第二個參數而不是第一個參數,會發生什麼?它再次導致同樣的問題.. –

0

1 .-可選的arg1,arg2的不可選

我想改變參數的順序,所以第一個參數是真正可選的。

2:可選的arg1,arg2的不是可有可無的,沒有重新排序 (不是最好的主意,但我認爲業務規則需要它)

做一個包裝函數。

SomeController { 
    wrapperFun(arg2) { 
     actualFunction(null, arg2) 
    } 
    actualFun(arg1, arg2) { 
     // do something 
    } 
} 

現在你可以有:

SomeController/wrapperFun/ABC

SomeController/actualFun/ARG1/ABC

然後用路由的魔力,你可以重定向actualFun/ABCwrapperFun/ABC。所以用戶只會看到漂亮的網址。

3.-可選的arg1,arg2的可選

所以,你有4點可能的選擇,對不對?

somecontroller/action/arg1/arg2 
somecontroller/action/arg1 
somecontroller/action/arg2 
somecontroller/action 

我相信這是你的實際問題:

如何處理有多個可選參數的函數?

在這種情況下,您需要使用的是關聯數組。實際上,CakePHP在很多方面都是如此。它看起來像這樣:

$arr = {"arg2" => "some val"}; 
// calling the function with $arr 
// some_action($arr); 
some_action($argArr) { 
    $arg1 = isset($argArr["arg1"]) ? $argArr["arg1"] : null; 
    $arg2 = isset($argArr["arg2"]) ? $argArr["arg2"] : null; 
} 

現在,關於URLs,這是由您決定的。你必須有一個機制,告訴你URL的每個部分代表什麼價值。想到什麼有兩種選擇:

首先,使用佔位符(醜):

some_controller/some_action/arg1/non/arg3/non/arg4 

或者,使用的包裝動作,類似於在我的答案見過(醜也)。

some_controller/action5/arg5 
// then in the wrapper (action5) you have: 
action5(arg) { 
    $arr = {"arg5" => arg}; 
    some_action($arr); 
} 

正如你所看到的,這很容易失控。我不知道你在做什麼,但似乎你是通過錯誤的渠道發送數據。

您可能想要使用POST並直接使用數組,而不是構建自己的數組,請檢查request object

+0

我想包裝是唯一的選擇。歡呼 –

+0

我剛纔在博比的回答中看到了你的評論。鑑於新的需求,我會修改答案。 – givanse

相關問題