- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试使用 Laravel 5 构建和应用程序。它应该是一个使用多个数据库的 Multi-Tenancy 数据库架构。出于安全目的,我的雇主要求这样做。
我曾尝试手动管理主数据库迁移和租户迁移,但都失败了。所以我决定借助 Laravel 特定包的帮助,这应该是我需要的。
Tenanti提供了一种方法来解决我的目的,但问题是我是一名新手开发人员,无法完全理解如何在我的应用程序中使用它。
我相信我已经正确安装了它:
composer require "orchestra/tenanti=~3.0"
在配置应用文件中添加这些提供者和别名:
'providers' => [
// ...
Orchestra\Tenanti\TenantiServiceProvider::class,
Orchestra\Tenanti\CommandServiceProvider::class,
],
'aliases' => [
'Tenanti' => Orchestra\Support\Facades\Tenanti::class,
],
最后发布配置并根据多个数据库的文档进行调整:
php artisan vendor:publish
return [
'drivers' => [
'user' => [
'model' => App\User::class,
'migration' => 'tenant_migrations',
'path' => database_path('tenanti/user'),
],
],
];
此时我仍然不清楚下一步该做什么?
我的疑惑如下:
我尝试运行包中附带的一些 artisan 命令,例如:
php artisan tenanti:install {driver}
php artisan tenanti:make {driver} {name}
但是我收到这样的错误:
[InvalidArgumentException] Database connection [tenants] is not available.
我在哪里可以找到资源以了解如何进行此操作?
最佳答案
+1 到@morphatic 答案,它在大多数情况下都非常准确。
One set of files is for the main DB which will store all the tenant information and the other files will be for the tenant DB. So how and where will these be stored?
对于您的主数据库,您应该能够使用默认的 database/migration
并利用 php artisan make:migration
和 php artisan migrate
.
然而,Tenanti 将使用在“驱动程序”配置下设置的迁移路径。例如:
'path' => database_path('tenanti/user'),
在这种情况下,将从 database/tenanti/user
创建/迁移迁移(您可以选择其他文件夹,它将使用该文件夹)。设置完成后,您可以通过 php artisan tenanti:make user create_blogs_table
(作为示例)为用户租户创建新的迁移文件,并通过 php artisan tenanti:migrate user
(看看 Laravel 迁移命令和 Tenanti 之间的相似之处?)。
司机
Driver 只是对租户的分组,你可以按用户、公司或团队等对其进行分组。并且有可能每个项目你可能需要不止一种类型的组,否则大多数时候你只能使用单个“组”或“驱动程序”。
身份验证或访问数据库
How will I handle the authentication for the application? I mean whenever a tenant logs in, I will have to make sure the connection to the database changes dynamically. How will I accomplish this?
首先,您需要考虑计划如何区分每个租户。大多数时候我会看到人们倾向于选择子域。因此在这种情况下,您需要使用中间件检查子域是否属于任何用户(通过查询主数据库),然后连接到属于该用户的数据库。
Tenanti 不管理流程的这一部分,因为每个人在这方面都有不同的风格,但我们确实提供了一个代码来从基本数据库配置动态连接到您的数据库租户。
假设您有以下配置:
<?php
return [
'fetch' => PDO::FETCH_CLASS,
'default' => 'primary',
'connections' => [
'primary' => [
//
],
'tenants' => [
'driver' => 'mysql',
'host' => 'dbhost', // for user with id=1
'username' => 'dbusername', // for user with id=1
'password' => 'dbpassword', // for user with id=1
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
],
],
'migrations' => 'migrations',
'redis' => [ ... ],
];
您可以按照 https://github.com/orchestral/tenanti#multi-database-connection-setup 中提供的步骤进行操作并添加以下代码。
<?php namespace App\Providers;
use Orchestra\Support\Facades\Tenanti;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Tenanti::setupMultiDatabase('tenants', function (User $entity, array $template) {
$template['database'] = "tenant_{$entity->getKey()}";
return $template;
});
}
}
这将确保您为 user=1 使用 tenant_1
数据库,为 user=2 使用 tenant_2
数据库,依此类推。
那么 Tenanti 如何检测活跃的用户呢?这是您需要在中间件中添加逻辑的地方。
$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();
Tenanti::driver('user')->asDefaultDatabase($user, 'tenants_{id}');
关于php - 如何在 Laravel 5 中使用 orchestral/tenanti 构建具有多个数据库的 Multi-Tenancy 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32902643/
我正在尝试使用 Laravel 5 构建和应用程序。它应该是一个使用多个数据库的 Multi-Tenancy 数据库架构。出于安全目的,我的雇主要求这样做。 我曾尝试手动管理主数据库迁移和租户迁移,但
我是一名优秀的程序员,十分优秀!