Rain Halcyon
Halcyon is a file based ORM, and the cousin of Eloquent. The goal of this library is to create a solution for file based object storage that shares the same API as database stored models.
Registering a data source
Datasources reside inside a resolving container called October\Rain\Halcyon\Datasource\Resolver. The following datasources are supported:
October\Rain\Halcyon\Datasource\FileDatasource: File-based datasource.October\Rain\Halcyon\Datasource\DbDatasource: Database-based datasource.October\Rain\Halcyon\Datasource\AutoDatasource: Loads templates from multiple data sources.
Here is an example of registering a datasource called theme1, then binding the resolver to all models.
use October\Rain\Halcyon\Model;
use October\Rain\Filesystem\Filesystem;
use October\Rain\Halcyon\Datasource\FileDatasource;
use October\Rain\Halcyon\Datasource\Resolver;
$datasource = new FileDatasource('/path/to/theme', new Filesystem);
$resolver = new Resolver(['theme1' => $datasource]);
$resolver->setDefaultDatasource('theme1');
Model::setDatasourceResolver($resolver);
Model example
Inherit the October\Rain\Halcyon\Model to create a new model:
<?php
use October\Rain\Halcyon\Model;
class MyPage extends Model
{
/**
* @var array The attributes that are mass assignable.
*/
protected $fillable = [
'markup',
'title',
];
/**
* @var string The container name associated with the model, eg: pages.
*/
protected $dirName = 'pages';
}
The following attributes are reserved and have baked in functionality:
- fileName: Reserved for the template file name.
- content: Reserved for the complete file contents.
- settings: Stores the template INI settings.
- markup: Stores the template HTML markup.
- code: Stores the template PHP code (optional).
- mtime: Last modified time.
Now we are free to create a new page:
MyPage::create([
'fileName' => 'my-file',
'title' => 'Test page',
'markup' => '<p>Hello world!</p>'
]);
Executing the above code will create a new file /path/to/theme/pages/my-file.htm, with the following contents:
title = "Test page" == <p>Hello world!</p>
We can find the page and use it later:
$page = MyPage::find('my-file');
echo '<h1>'.$page->title.'</h1>';
echo $page->markup;
If we change the file name, it will be renamed on the file system too:
// New file path: /path/to/theme/pages/renamed-file.htm $page->fileName = 'renamed-file'; $page->save();