Laravel Tenanti:默认驱动程序未实现

时间:2018-06-09 11:27:41

标签: php laravel-5

我想实现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}');

我正在尝试从我的主数据库验证用户,并在进行身份验证时,特别使用为该经过身份验证的用户创建的数据库。

1 个答案:

答案 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应用程序中的不同用户。

干杯。