我想实现Orchestral / Tenanti为我的应用注册的每家公司创建数据库。
当我添加数据库连接解析器时,如上所述 https://github.com/orchestral/tenanti我收到以下错误
InvalidArgumentException数据库连接[租户]不可用。
谷歌搜索后,我在stackoverflow上找到了cynobone的答案 https://stackoverflow.com/a/33320724/9604136使用setupMultiDatabase而不是连接,这给了我另一个错误
InvalidArgumentException未实现默认驱动程序。
对于我的应用,当我为每家公司创建新数据库时,我做了相应更改
tenanti.php
'drivers' => [
'company' => [
'model' => App\Company::class,
'path' => database_path('tenanti/company'),
'shared' => false,
],
],
AppServiceProvider.php
public function boot()
{
Tenanti::setupMultiDatabase('tenants', function (Company $entity, array $config) {
$config['database'] = "comp_{$entity->getKey()}";
// refer to config under `database.connections.tenants.*`.
return $config;
});
}
database.php中
'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,
],
我也处于两难境地
$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();
Tenanti::driver('user')->asDefaultDatabase($user, 'comp_{id}');
我正在尝试从我的主数据库验证用户,并在进行身份验证时,特别使用为该经过身份验证的用户创建的数据库。
答案 0 :(得分:1)
正如您所说,在Tenanti的GitHub自述注释之后,也让我感到困惑,但是cynobone的帖子 帮助解决了第一个问题,但是这也使我遇到了第二个问题:
InvalidArgumentException未实现默认驱动程序。
*请注意,我正在使用app \ config \ database.php文件中的默认设置配置Laravel 5项目
以下是该文件的内容:
'connections' => [
'superadmins' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'admins' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST_SECOND', '127.0.0.1'),
'port' => env('DB_PORT_SECOND', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => env('DB_MYSQL_STRICT_MODE', true),
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
这只是文件的一部分,其他只是默认内容。
在我的情况下,我将连接“承租人”更改为名为“ admins”和“ superadmins”的新连接,但它应与您的“承租人”连接相同。默认连接是一个名为“ mysql”的连接,随后我进行了连接以建立2个新连接。
我通过复制修复了引用的错误
'prefix' => '',
'prefix_indexes' => true,
'strict' => env('DB_MYSQL_STRICT_MODE', true),
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
...进入“租户”连接,它修复了该错误。希望它对您也有帮助。
此外,您需要输入
$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();
Tenanti::driver('user')->asDefaultDatabase($user, 'comp_{id}');
...在中间件中,您需要该中间件来验证Web应用程序中的不同用户。
干杯。