搜索主键时,CakePhp2 搜索表单从 post 切换到非 post

CakePhp2 Search form switches from post to not post, when searching for the primary key

今天我发现了一个非常奇怪的行为,我想阻止它。

我使用 CakePhp 2.9 并有一个搜索表单,我想用它来搜索订单。由于与其他模型的关系,我在模型中的主键是 session_id。

class Order extends AppModel
{    
    public $primaryKey = 'session_id';

我用

打开我的搜索表单
    <?php echo $this->Form->create(
        'Order',
        array(
            'url' => array('controller' => 'orders', 'action' => 'search')
        )
    ); ?>

结果如下 HTML:

<form id="OrderSearchForm" action="/orders/search" method="post" accept-charset="utf-8">

在控制器中,我根据请求是否为 post 类型做不同的事情。 为了调试奇怪的行为,我在控制器中添加了以下调试行:

    if ($this->request->is('post')) {
        debug('post');
    } else if ($this->request->is('get')) {
        debug('get');
    } else {
        debug($_REQUEST);
        debug($_GET);
        debug($_POST);
    }

因此,只要我搜索订单 session_id 以外的其他值,或者将 session_id 与其他搜索值组合,一切都很好。 但是,只要我只搜索 session_id,搜索表单生成的 HTML 就会更改为

<form id="OrderSearchForm" action="/orders/search/mysearchvaluesessionidstring" method="post" accept-charset="utf-8">

然后当我提交表格时,它突然不再被视为 "post"。 $_GET 的调试输出仍然是空的,$_POST 的调试输出仍然是填充的,但是不再触发条件 if ($this->request->is('post'))。

如何改变这种行为?

当请求数据仅包含会话 ID 时,cake 可能正在将请求类型更改为 PUT。您可以通过检查 if ($this->request->is(array('post', 'put'))) 而不是仅仅检查 POST 请求来解决这个问题。

您可以详细了解为什么会发生这种情况here