为什么CakePHP 3分页器没有向自定义查找程序方法发送选项?

时间:2015-03-09 21:03:15

标签: cakephp cakephp-3.0

我试图在Cakephp 3.0.0-RC1中使用自定义查找器进行分页。 The docs说我应该这样做:

$customFinderOptions = [
    'tags' => $tags
];
$this->paginate = [
    'finder' => [
        'tagged' => $customFinderOptions
    ]
];
$articles = $this->paginate($this->Articles);

所以我的控制器方法包含

$this->paginate = [
    'finder' => [
        'recentActivity' => [
            'limit' => 5,
            'offset' => 2,
            'foo' => 'bar'
        ]
    ]
];
$results = $this->paginate($this->ModelName);

ModelNameTable::findRecentActivity()的顶部,pr($options)会产生以下结果:

Array
(
    [foo] => bar
    [whitelist] => Array
    (
        [0] => limit
        [1] => sort
        [2] => page
        [3] => direction
    )
)

limitoffset去了哪里?在CakePHP 3核心中挖掘了一下,我在ORM.Table.php的顶部看到了

public function callFinder($type, Query $query, array $options = [])
{
    $query->applyOptions($options);
    $options = $query->getOptions();
    $finder = 'find' . $type;
    if (method_exists($this, $finder)) {
        return $this->{$finder}($query, $options);
    }

啊,所以limitoffset进入了$query。不幸的是,我无法想出一种实用的方法来从我的自定义查找器方法中取出它们。 我检查过,$options准确反映了我在$options = $query->getOptions();覆盖之前设置的选项,并删除了limitoffset值。

文档让我期望$options被传递(完整)到我的自定义查找程序方法。所以我的问题是......

  1. 我是否错误地使用了paginator组件/客户端查找器?
  2. 这是预期的行为,还是我应该report an issue的事情?我是CakePHP 3的新手并且仍在我的脑袋周围,所以我没有我想跳到这是一个错误的结论。
  3. 旁注:我知道我可以通过在$options中使用不同的密钥来解决这个问题,例如foo_limitfoo_offset来完成我想要的工作。

2 个答案:

答案 0 :(得分:1)

了解混乱的来源。除了我在问题评论中表达的关于你的查询可能相互矛盾的选项的问题,我认为你应该知道以下选项列表直接复制到查询中,而不是解释为你的finder方法的自定义选项:

  • '字段的
  • '条件'
  • '加入'
  • '订单'
  • '限制'
  • '偏移'
  • '基团'
  • '具有'
  • '包含'
  • '页'

这些选项将调用匹配的查询方法来设置其内部状态。

答案 1 :(得分:0)

原来......

  1. 不正确为自定义查找程序设置的所有选项都会被忽略。 José's answer中列出的大多数选项都已集成到查询中,然后在将$options传递给自定义查找程序方法之前从$options 中删除。
  2. 但是,自定义查找程序limit始终被$this->paginate['limit']或默认值20覆盖(同样使用page) 。但看起来这已被确定为错误is going to be fixed