CakePHP,GET参数和路由

时间:2010-12-18 16:50:56

标签: cakephp url-routing

我对cakephp相当新,但我有一个与网址和参数有关的问题。我希望能够有一个看起来像标准网址的网址,例如:

http://www.mysite.com/controller/myaction?arg=value&arg2=val

我希望该网址映射到我的控制器中的操作,如下所示:

function myaction($arg = null, $arg2 = null)
{
   // do work
}

我意识到cakephp有here描述的路由,但老实说,这似乎过度设计并导致一个非标准的url字符串。

在我目前的情况下,网址是由外部(计费)系统生成和调用的,该系统对蛋糕一无所知,也不支持蛋糕网址格式。

3 个答案:

答案 0 :(得分:11)

您可以使用任何形式的网址。只是CakePHP允许您从变量$this->params['url']

中检索通过GET传递的变量
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