我对cakephp相当新,但我有一个与网址和参数有关的问题。我希望能够有一个看起来像标准网址的网址,例如:
http://www.mysite.com/controller/myaction?arg=value&arg2=val
我希望该网址映射到我的控制器中的操作,如下所示:
function myaction($arg = null, $arg2 = null)
{
// do work
}
我意识到cakephp有here描述的路由,但老实说,这似乎过度设计并导致一个非标准的url字符串。
在我目前的情况下,网址是由外部(计费)系统生成和调用的,该系统对蛋糕一无所知,也不支持蛋糕网址格式。
答案 0 :(得分:11)
您可以使用任何形式的网址。只是CakePHP允许您从变量$this->params['url']
function myaction()
{
if(isset($this->params['url']['arg']))
$arg = $this->params['url']['arg'];
if(isset($this->params['url']['arg2']))
$arg2 = $this->params['url']['arg2'];
}
答案 1 :(得分:1)
CakePHP 2.x的AppController中的解决方案
class AppController extends Controller {
....
/***
* Recupera los Named envias por URL
* si es null $key emtraga el array completo de named
*
* @param String $key
*
* @return mixed
*/
protected function getNamed($key=null){
// Is null..?
if(is_string($key)==true){
// get key in array
return Hash::get($this->request->param('named'), $key);
}else{
// all key in array
return $this->request->param('named');
}
}
...
}
答案 2 :(得分:0)
我有类似的问题。不是因为我有一个外部系统,而是因为我不想把所有参数都放到URL路径中。在我的示例中,我有一些搜索查询被汇编并传递给控制器。恕我直言,这些查询应该是GET参数,而不是URL路径的一部分。
使用GET参数的一个优点是给定参数的顺序并不重要,与通过URL路径传递params相反。
要以通用的方式解决这个问题,我将使用GET-param的值替换所有方法参数,如果给出了一个具有相同名称的方法:
class MyController extends AppController
{
function test($var1 = null, $var2 = "content2")
{
foreach (get_defined_vars() as $key => $value) {
if (isset($this->params['url'][$key])) {
$getvalue = $this->params['url'][$key];
$$key = $getvalue;
CakeLog::write("debug", "Setting:$key to $getvalue");
}
}
CakeLog::write("debug", print_r(get_defined_vars(), true));
}
}
现在我可以访问这个控制器方法并通过GET传递参数,如下所示:
http://myapp/mycontroller/test?var1=foo&var2=bar