我的行动定义如下:
function actionName($par1 = null, $par2 = null)
我需要一条特殊的路线,如: example.com/r/ABCD ,应致电
SomeController->actionName(null, "ABCD")
如何使用Cake的Router :: connect()来实现?
答案 0 :(得分:1)
您可以尝试撤消
之类的参数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/ABC
重定向到wrapperFun/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;
}
现在,关于URL,由您决定。您必须具有一种机制,可以告诉您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。