Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP路由器:如何传递第一个参数null?_Cakephp - Fatal编程技术网

CakePHP路由器:如何传递第一个参数null?

CakePHP路由器:如何传递第一个参数null?,cakephp,Cakephp,我的行为定义如下: function actionName($par1 = null, $par2 = null) 我需要一条特殊的路线,看起来像:example.com/r/ABCD哪个应该呼叫 SomeController->actionName(null, "ABCD") 如何使用Cake的Router::connect()实现这一点?您可以尝试反转参数,如 function actionName( $par2 = null, $par1 = null) 1.-arg1可选,a

我的行为定义如下:

function actionName($par1 = null, $par2 = null)
我需要一条特殊的路线,看起来像:example.com/r/ABCD哪个应该呼叫

SomeController->actionName(null, "ABCD")

如何使用Cake的Router::connect()实现这一点?

您可以尝试反转参数,如

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

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
。因此,用户只能看到漂亮的URL

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的每个部分代表什么值。我想到的是两种选择:

首先,使用占位符(丑陋):

或者,使用包装器操作,类似于之前在我的答案中看到的(也很难看)

正如你所看到的,这很容易失控。我不知道您实际上在尝试做什么,但似乎您通过错误的通道发送数据


您可能希望直接使用POST和阵列,而不是构建自己的阵列,请查看。

我认为默认的蛋糕路由功能不可能做到这一点。你首先应该避免这种情况。ps,请始终提及您的确切CakePHP版本!如果您的第一个参数是
NULL
,那么听起来您的参数可能需要重新排序。如果我只想传递第二个参数而不是第一个参数,会发生什么?这又导致了同样的问题。我想包装是这里唯一的选择。谢谢,我刚刚在博比的回答中看到了你的评论。根据新的需要,我将修改答案。
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);
}