Переопределение data\Source::read() и использование item() дает мне неправильные результаты

Я пытаюсь переопределить lithium\data\source\Http::read(), выполнив Создание источников данных . Это результат моей проблемы в Как мне отправить POST для cURL в литии.

У меня сейчас что-то вроде этого:

<?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(), любой поисковик вернет массив как есть. Если я использую item(), я получаю только первое значение массива, которое в данном случае будет 42.

Любая идея, что я делаю неправильно здесь?

ОБНОВЛЕНИЕ Оказывается, только find('first') вызывает указанную выше проблему. Использование find('all') возвращает объект, как и ожидалось. Не совсем уверен, как это исправить.

ОБНОВЛЕНИЕ № 2 Я обновил приведенный выше код read() новым кодом возврата. Если я покажу результаты перед возвратом из read(), я увижу правильный объект Document. Похоже, что-то происходит в методе find(). Кстати, я не запускаю никаких фильтров для модели. Любая идея, как я могу отладить это?


person Housni    schedule 21.08.2013    source источник


Ответы (1)


item() больше не существует .
Вам просто нужно заменить эту строку на YourModel::create($decoded, ['exists' => true]);

Пожалуйста, откройте вопрос в ручном репозитории, чтобы обновить эту часть документации ;-)

person Mehdi Lahmam B.    schedule 21.08.2013
comment
Это определенно намного чище. Я не понял об исключении item(), потому что забыл вытащить из своего литиевого субмодуля :/ Однако проблема все еще существует. Я все еще получаю первое значение массива, когда использую find('first') (вместо получения самого первого массива, и find('all') работает нормально. Я продолжу и сделаю этот билет немного позже :) - person Housni; 22.08.2013
comment
Я обновил свой код, чтобы $_classes['schema'] содержал lithium\data\DocumentSchema вместо lithium\data\Schema. - person Housni; 22.08.2013
comment
Теперь должно быть хорошо ;-) - person Mehdi Lahmam B.; 24.08.2013
comment
Единственный способ заставить это работать — сделать $decoded массивом массивов: return $model::create([$decoded], ['exists' => true]); - person Housni; 26.08.2013