mirror of
https://github.com/friendica/friendica
synced 2025-04-26 15:50:10 +00:00
Restructure Storage to new paradigm
This commit is contained in:
parent
24f8ee8e67
commit
2ab0d06996
29 changed files with 229 additions and 199 deletions
|
@ -4,7 +4,7 @@ Friendica Storage Backend Addon development
|
|||
* [Home](help)
|
||||
|
||||
Storage backends can be added via addons.
|
||||
A storage backend is implemented as a class, and the plugin register the class to make it avaiable to the system.
|
||||
A storage backend is implemented as a class, and the plugin register the class to make it available to the system.
|
||||
|
||||
## The Storage Backend Class
|
||||
|
||||
|
@ -12,14 +12,14 @@ The class must live in `Friendica\Addon\youraddonname` namespace, where `youradd
|
|||
|
||||
There are two different interfaces you need to implement.
|
||||
|
||||
### `IWritableStorage`
|
||||
### `ICanWriteToStorage`
|
||||
|
||||
The class must implement `Friendica\Model\Storage\IWritableStorage` interface. All method in the interface must be implemented:
|
||||
The class must implement `Friendica\Core\Storage\Capability\ICanWriteToStorage` interface. All method in the interface must be implemented:
|
||||
|
||||
```php
|
||||
namespace Friendica\Model\Storage\IWritableStorage;
|
||||
namespace Friendica\Core\Storage\Capability\ICanWriteToStorage;
|
||||
|
||||
interface IWritableStorage
|
||||
interface ICanWriteToStorage
|
||||
{
|
||||
public function get(string $reference);
|
||||
public function put(string $data, string $reference = '');
|
||||
|
@ -33,17 +33,17 @@ interface IWritableStorage
|
|||
- `put(string $data, string $reference)` saves data in `$data` to position `$reference`, or a new position if `$reference` is empty.
|
||||
- `delete(string $reference)` delete data pointed by `$reference`
|
||||
|
||||
### `IStorageConfiguration`
|
||||
### `ICanConfigureStorage`
|
||||
|
||||
Each storage backend can have options the admin can set in admin page.
|
||||
To make the options possible, you need to implement the `Friendica\Model\Storage\IStorageConfiguration` interface.
|
||||
To make the options possible, you need to implement the `Friendica\Core\Storage\Capability\ICanConfigureStorage` interface.
|
||||
|
||||
All methods in the interface must be implemented:
|
||||
|
||||
```php
|
||||
namespace Friendica\Model\Storage\IStorageConfiguration;
|
||||
namespace Friendica\Core\Storage\Capability\ICanConfigureStorage;
|
||||
|
||||
interface IStorageConfiguration
|
||||
interface ICanConfigureStorage
|
||||
{
|
||||
public function getOptions();
|
||||
public function saveOptions(array $data);
|
||||
|
@ -108,7 +108,7 @@ When the plugin is uninstalled, registered backends must be unregistered using
|
|||
`DI::facStorage()->unregister(string $class)`.
|
||||
|
||||
You have to register a new hook in your addon, listening on `storage_instance(App $a, array $data)`.
|
||||
In case `$data['name']` is your storage class name, you have to instance a new instance of your `Friendica\Model\Storage\IStorage` class.
|
||||
In case `$data['name']` is your storage class name, you have to instance a new instance of your `Friendica\Core\Storage\Capability\ICanReadFromStorage` class.
|
||||
Set the instance of your class as `$data['storage']` to pass it back to the backend.
|
||||
|
||||
This is necessary because it isn't always clear, if you need further construction arguments.
|
||||
|
@ -124,7 +124,7 @@ Add a new test class which's naming convention is `StorageClassTest`, which exte
|
|||
Override the two necessary instances:
|
||||
|
||||
```php
|
||||
use Friendica\Model\Storage\IWritableStorage;
|
||||
use Friendica\Core\Storage\Capability\ICanWriteToStorage;
|
||||
|
||||
abstract class StorageTest
|
||||
{
|
||||
|
@ -132,7 +132,7 @@ abstract class StorageTest
|
|||
abstract protected function getInstance();
|
||||
|
||||
// Assertion for the option array you return for your new StorageClass
|
||||
abstract protected function assertOption(IWritableStorage $storage);
|
||||
abstract protected function assertOption(ICanWriteToStorage $storage);
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -156,16 +156,16 @@ If there's a predecessor to this exception (e.g. you caught an exception and are
|
|||
Example:
|
||||
|
||||
```php
|
||||
use Friendica\Model\Storage\IWritableStorage;
|
||||
use Friendica\Core\Storage\Capability\ICanWriteToStorage;
|
||||
|
||||
class ExampleStorage implements IWritableStorage
|
||||
class ExampleStorage implements ICanWriteToStorage
|
||||
{
|
||||
public function get(string $reference) : string
|
||||
{
|
||||
try {
|
||||
throw new Exception('a real bad exception');
|
||||
} catch (Exception $exception) {
|
||||
throw new \Friendica\Model\Storage\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception);
|
||||
throw new \Friendica\Core\Storage\Exception\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -186,12 +186,12 @@ The file will be `addon/samplestorage/SampleStorageBackend.php`:
|
|||
<?php
|
||||
namespace Friendica\Addon\samplestorage;
|
||||
|
||||
use Friendica\Model\Storage\IWritableStorage;
|
||||
use Friendica\Core\Storage\Capability\ICanWriteToStorage;
|
||||
|
||||
use Friendica\Core\Config\Capability\IManageConfigValues;
|
||||
use Friendica\Core\L10n;
|
||||
|
||||
class SampleStorageBackend implements IWritableStorage
|
||||
class SampleStorageBackend implements ICanWriteToStorage
|
||||
{
|
||||
const NAME = 'Sample Storage';
|
||||
|
||||
|
@ -247,12 +247,12 @@ class SampleStorageBackend implements IWritableStorage
|
|||
<?php
|
||||
namespace Friendica\Addon\samplestorage;
|
||||
|
||||
use Friendica\Model\Storage\IStorageConfiguration;
|
||||
use Friendica\Core\Storage\Capability\ICanConfigureStorage;
|
||||
|
||||
use Friendica\Core\Config\Capability\IManageConfigValues;
|
||||
use Friendica\Core\L10n;
|
||||
|
||||
class SampleStorageBackendConfig implements IStorageConfiguration
|
||||
class SampleStorageBackendConfig implements ICanConfigureStorage
|
||||
{
|
||||
/** @var \Friendica\Core\Config\Capability\IManageConfigValues */
|
||||
private $config;
|
||||
|
@ -357,8 +357,8 @@ function samplestorage_storage_config(App $a, array &$data)
|
|||
**Theoretically - until tests for Addons are enabled too - create a test class with the name `addon/tests/SampleStorageTest.php`:
|
||||
|
||||
```php
|
||||
use Friendica\Model\Storage\IWritableStorage;
|
||||
use Friendica\Test\src\Model\Storage\StorageTest;
|
||||
use Friendica\Core\Storage\Capability\ICanWriteToStorage;
|
||||
use Friendica\Test\src\Core\Storage\StorageTest;
|
||||
|
||||
class SampleStorageTest extends StorageTest
|
||||
{
|
||||
|
@ -371,7 +371,7 @@ class SampleStorageTest extends StorageTest
|
|||
}
|
||||
|
||||
// Assertion for the option array you return for your new StorageClass
|
||||
protected function assertOption(IWritableStorage $storage)
|
||||
protected function assertOption(ICanWriteToStorage $storage)
|
||||
{
|
||||
$this->assertEquals([
|
||||
'filename' => [
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue