Installation:
composer require dovstone/keyval-db
Ensure your composer.json specifies Laravel compatibility (e.g., "require": {"laravel/framework": "^10.0"}).
Publish Configuration (if applicable):
php artisan vendor:publish --provider="Dovstone\KeyvalDb\KeyvalDbServiceProvider"
Note: Verify if the package publishes config via config/keyval-db.php or similar.
Database Setup:
php artisan migrate
keyval_entries) with columns like key (string), value (text/json), and expires_at (timestamp).First Usage:
use Dovstone\KeyvalDb\Facades\KeyvalDb;
// Set a key-value pair
KeyvalDb::set('user:123:preferences', ['theme' => 'dark']);
// Get a value
$preferences = KeyvalDb::get('user:123:preferences');
// Delete a key
KeyvalDb::delete('user:123:preferences');
Check Documentation:
src/ directory for classes like KeyvalDbManager, KeyvalDbQueryBuilder, or KeyvalDbModel.README.md or USAGE.md in the repo (even if minimal).// Set with TTL (time-to-live in seconds)
KeyvalDb::set('cache:homepage', $data, 3600);
// Get with fallback
$data = KeyvalDb::get('cache:homepage', []);
// Check existence
if (KeyvalDb::has('cache:homepage')) { ... }
// Delete
KeyvalDb::delete('cache:homepage');
KeyvalDb::setMultiple([
'key1' => 'value1',
'key2' => 'value2',
]);
$batch = KeyvalDb::getMultiple(['key1', 'key2']);
// Example: Find keys matching a pattern
$results = KeyvalDb::query()
->where('key', 'like', 'user:%')
->get();
Builder or use raw queries. Verify via source code.use Dovstone\KeyvalDb\Events\KeyUpdated;
event(new KeyUpdated('user:123:preferences'));
EventServiceProvider:
protected $listen = [
KeyUpdated::class => [
\App\Listeners\SyncUserPreferences::class,
],
];
use Dovstone\KeyvalDb\Traits\HasKeyval;
class User extends Model
{
use HasKeyval;
protected $keyvalTable = 'user_metadata';
}
// Usage:
$user->setKeyval('preferences', ['theme' => 'dark']);
$prefs = $user->getKeyval('preferences');
// Cache a value for 1 hour
KeyvalDb::set('cache:featured_posts', $posts, 3600);
// Retrieve cached data
$posts = KeyvalDb::get('cache:featured_posts', function () {
return Post::featured()->get();
});
$this->app->singleton('keyval', function ($app) {
return new \Dovstone\KeyvalDb\KeyvalDbManager();
});
public function __construct(private KeyvalDbManager $keyval) {}
public function handle($request, Closure $next)
{
if ($request->keyvalKey && !str_starts_with($request->keyvalKey, 'safe:')) {
abort(403);
}
return $next($request);
}
public function test_keyval_operations()
{
$this->artisan('migrate:fresh')
->assertExitCode(0);
KeyvalDb::set('test:key', 'value');
$this->assertEquals('value', KeyvalDb::get('test:key'));
}
$mock = Mockery::mock('alias:keyval');
$mock->shouldReceive('get')->andReturn(['data']);
key column is indexed in the database:
Schema::table('keyval_entries', function (Blueprint $table) {
$table->index('key');
});
DB::transaction(function () {
KeyvalDb::setMultiple($largeDataset);
});
Route::get('/api/keyval/{key}', function ($key) {
return KeyvalDb::get($key);
});
Route::post('/api/keyval', function (Request $request) {
KeyvalDb::set($request->key, $request->value);
return response()->json(['status' => 'set']);
});
No Official Documentation:
README.md or usage guide. Reverse-engineer usage by inspecting:
src/ directory for classes/methods.tests/ for example usage.composer.json for dependencies (e.g., Laravel version requirements).Undocumented Dependencies:
doctrine/dbal, illuminate/database) that may conflict with your project.composer why-not vendor/package to debug missing dependencies.Database Schema Assumptions:
keyval_entries). Verify migrations or create your own if needed:
Schema::create('keyval_entries', function (Blueprint $table) {
$table->string('key')->unique();
$table->text('value');
$table->timestamp('expires_at')->nullable();
$table->timestamps();
});
Namespace Collisions:
KeyvalDb or similar, alias it to avoid conflicts:
use Dovstone\KeyvalDb\Facades\KeyvalDb as Keyval;
No Built-in Serialization:
KeyvalDb::set('user:123:data', serialize($complexObject));
$object = unserialize(KeyvalDb::get('user:123:data'));
json_encode()/json_decode() for JSON-compatible data.Lack of Query Builder Features:
where('value', 'like', '%search%')). Fallback to raw queries:
$results = DB::table('keyval_entries')
->where('value', 'like', '%search%')
->get();
No Rate Limiting:
Route::middleware(['throttle:60,1'])->group(function () {
// Keyval API routes
});
TTL (Time-to-Live) Quirks:
How can I help you explore Laravel packages today?