envor / laravel-datastore
本地 Laravel
v1.2.19
2024-08-02 02:38 UTC
Requires
- php: ^8.1
- envor/laravel-schema-macros: ^1.1.5
- envor/platform: ^1.3.9
- illuminate/contracts: ^11.0
- spatie/laravel-package-tools: ^1.16.2
Requires (Dev)
- larastan/larastan: *
- laravel/octane: ^2.3
- laravel/pint: *
- livewire/volt: ^1.6
- nunomaduro/collision: *
- orchestra/testbench: ^9.0
- pestphp/pest: ^2.33
- pestphp/pest-plugin-arch: ^2.7
- pestphp/pest-plugin-laravel: ^2.2
- spatie/docker: ^1.12
README
处理不同类型动态数据库的简单策略
安装
您可以通过 composer 安装此包
composer require envor/laravel-datastore
您可以使用以下命令发布并运行迁移
php artisan vendor:publish --tag="datastore-migrations"
php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --tag="datastore-config"
这是发布配置文件的内容
return [ 'model' => \Envor\Datastore\Models\Datastore::class, 'create_databases' => env('DATASTORE_CREATE_DATABASES', true), ];
用法
您实际上不需要使用模型或运行迁移。您可以直接使用工厂类,如下所示
use Envor\Datastore\DatabaseFactory; $sqlite = DatabaseFactory::newDatabase('mydb', 'sqlite'); // Envor\Datastore\Databases\SQLite {#2841 ... $sqlite->create(); // true $sqlite->name; // ...storage/app/datastore/mydb.sqlite $sqlite->connection; // mydb $sqlite->migrate(); // INFO Preparing database. // Creating migration table ................ 9.55ms DONE $sqlite->configure(); config('database.default'); // "mydb" config('database.connections.mydb'); // [ // "driver" => "sqlite", // "url" => null, // "database" => "...storage/app/datastore/mydb.sqlite", // "prefix" => "", // "foreign_key_constraints" => true, // "name" => "mydb", // ]
/** * Create a newly registered user. * * @param array<string, string> $input */ public function create(array $input): User { $create = function () use ($input) { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', ])->validate(); return DB::transaction(function () use ($input) { return tap(User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), ]), function (User $user) { $this->createTeam($user); }); }); }; SQLite::make(database_path('my_backup.sqlite')) ->create() ->migratePath('database/migrations/platform') ->migrate() ->run($create) ->disconnect(); MariaDB::make('backup') ->create() ->migratePath('database/migrations/platform') ->migrate() ->run($create) ->disconnect(); return MariaDB::make('datastore') ->create() ->migratePath('database/migrations/platform') ->migrate() ->run($create) ->return(); }
中间件
您可以使用 'datastore.context' 中间件使应用在当前数据存储的上下文中运行
Route::get('/contexed', fn() => 'OK')->middleware('datastore.context'); // or Route::get('/contexed', fn() => 'OK')->middleware(\Envor\Datastore\DatastoreContextMiddleware::class); // will use the authenticated user to configure a database
您的用户必须实现 HasDatastoreContext
接口才能使此功能正常工作。
... use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements \Envor\Datastore\Contracts\HasDatastoreContex { use \Envor\Datastore\Concerns\BelongsToDatastore public function datastoreContext(): \Envor\Datastore\Contracts\ConfiguresDatastore; { return $this->datastore; } }
以下是相关的接口
interface HasDatastoreContext { public function datastoreContext(): ?\Envor\Datastore\Contracts\ConfiguresDatastore; } interface ConfiguresDatastore { public function configure(); public function use(); public function database(): ?\Envor\Datastore\Datastore; }
测试
composer test
变更日志
有关最近更改的更多信息,请参阅 变更日志
贡献
有关详细信息,请参阅 贡献指南
安全漏洞
有关报告安全漏洞的详细信息,请参阅 我们的安全策略
鸣谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件