0

我试图lithium\data\source\Http::read()通过遵循创建数据源来覆盖。这是我在How do I submit POST for cURL in Lithium中的问题的结果。

我现在有这样的事情:

<?php

namespace li3_tr42Auth\extensions\adapter\data\source\http;

class TR42 extends \lithium\data\source\Http {

    protected $_classes = [
        // unlike in the "Creating Data Sources" doc, I had to add the 'schema' key
        // or I get an error when 'Libraries' tries to instantiate it.
        'schema'  => 'lithium\data\DocumentSchema',
        'service' => 'lithium\net\http\Service',
        'entity'  => 'lithium\data\entity\Document',
        'set'     => 'lithium\data\collection\DocumentSet'
    ];

    public function read($query, array $options = []) {
        $params = $query->export($this, ['keys' => ['source', 'conditions']]);
        $source = Inflector::camelize($params['source']);
        $model = Libraries::locate('models', $source);
        .
        .
        .
        $decoded = $this->decode($response);
        /** at this point, $decoded contains an associative array like:
         * Array(
         *     [id] => 42,
         *     [name] => Housni,
         *     [status] => 1,
         *     [country] => Colombo, Sri Lanka
         * )
         */
        return $model::create($decoded, ['exists' => true]);
    }
}
?>

如果我不使用item(),任何 finder 都会按原样返回数组。如果我确实使用,在这种情况下item(),我只会得到数组的第一个值。42

知道我在这里做错了什么吗?

更新 事实证明,只有 afind('first')会导致上述问题。find('all')正如预期的那样,使用返回一个对象。不太清楚如何解决这个问题。

更新#2read()用新的返回码更新了上面的代码。如果我在从返回之前显示结果read(),我会看到一个正确的Document对象。看起来find()方法中发生了一些事情。顺便说一句,我没有为模型运行任何过滤器。知道如何调试吗?

4

1 回答 1

1

item()不存在
您只需将这一行替换为YourModel::create($decoded, ['exists' => true]);

请在手动回购中打开一个问题以更新这部分文档;-)

于 2013-08-21T20:44:45.667 回答