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

Why is CakePHP 3 paginator not sending options to custom finder method?

我正在尝试使用 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. 我是否错误地使用了分页器组件/客户查找器?
  2. 这是预期的行为,还是我应该 report an issue 的行为? 我是 CakePHP 3 的新手,仍在思考它,所以我没有不想跳到这是一个错误的结论。

旁注:我知道我可以通过在 $options 中使用不同的键来解决这个问题,比如 foo_limitfoo_offset 来完成我想要的。

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

  • 'fields'
  • 'conditions'
  • 'join'
  • 'order'
  • 'limit'
  • 'offset'
  • 'group'
  • 'having'
  • 'contain'
  • 'page'

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

原来...

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