Lithium: пользовательский источник данных приводит к вызову неопределенного метода `configureClass()`
Я пытаюсь создать источник данных для работы с CSV. Я следую этому примеру
connections.php:
Connections::add('csv', [
'type' => 'file',
'adapter' => 'Csv',
]
);
приложение / расширение / адаптер / данные / источник / файл /Csv.php
namespace app\extensions\adapter\data\source\file;
use lithium\core\Libraries;
class Csv extends \app\extensions\adapter\data\source\File {
public function __construct(array $config = []) {
$defaults = [
'delimiter' => ',',
'enclosure' => '\"',
'escape' => '\\',
'path' => Libraries::get(true, 'resources') . '/file/csv',
];
$config += $defaults;
parent::__construct($config);
}
public function read($query, array $options = array()) {
print_r($query);
die();
}
}
приложение / расширения / адаптер / данные / источник / file.php
<?php
namespace app\extensions\adapter\data\source;
use lithium\core\Libraries;
class File extends \lithium\core\Object {
public function __construct(array $config = array()) {
$defaults = array(
'encoding' => 'UTF-8',
'path' => Libraries::get(true, 'resources') . '/file'
);
parent::__construct($config + $defaults);
}
}
?>
приложение / модели / Importers.php
<?php
namespace app\models;
class Importers extends \lithium\data\Model {
protected $_meta = [
'connection' => 'csv',
];
}
?>
Всякий раз, когда я звоню Importers::find('all');
с контроллера я получаю ошибку:
Fatal error: Call to undefined method app\extensions\adapter\data\source\file\Csv::configureClass() in ...
Если я определю configureClass()
Я получаю еще одну ошибку, заявляющую enable()
не определено. Не совсем уверен, что я здесь делаю не так.
1 ответ
Поправьте меня, если я ошибаюсь, но кажется, что File
должен расширять абстрактный класс \lithium\data\Source
что, в свою очередь, расширяет \lithium\core\Object
,
Следовательно, app/extensions/adapter/data/source/File.php
будет выглядеть так:
class File extends \lithium\data\Source {
Это комментарии для Source.php:
/**
* This is the base class for Lithium's data abstraction layer.
*
* In addition to utility methods and standardized properties, it defines the implementation tasks
* for all Lithium classes that work with external data, such as connections to remote resources
* (`connect()` and `disconnect()`), introspecting available data objects (`sources()` and
* `describe()`), and a standard read/write interface (`create()`, `read()`, `update()` and
* `delete()`).
*
* Subclasses may implement any other non-standard functionality, but the above methods define the
* requirements for interacting with `Model` objects, and other classes within `lithium\data`.
*/
Надеюсь, это кому-нибудь поможет (если я не ошибаюсь:)). Я люблю эту структуру!