我必须使用laravel构建一个多租户应用程序,并添加了一个子域中间件来根据请求更改数据库。我更改了SESSION_DOMAIN='.example.com'
,并将会话驱动程序也更改为数据库。通过重定向到仪表板,我的应用程序可以在localhost tenant.localhost:8000/login
中正常运行。但是在我登录的实时服务器http:\\tenant.example.com/login
中,它会显示以下错误。
答案 0 :(得分:0)
问题很可能是您在本地使用localhost
,但在生产中使用.runnerhit.com
。区别在于前导点.
对您的路由组定义中的那个是多余的。
答案 1 :(得分:0)
我也遭受这种情况的困扰。 plesae确保您在代码中使用路由名称而不是url 假设您的路线是:
Route::get('/','HomeController@index')->name('home.index');
使用route('homa.index')代替url('/')
答案 2 :(得分:0)
我对多数据库多租户的处理方式看起来像这样...
在.env
文件中,我添加了数据库。
# Database: Client 1
CLIENT_ONE_DB_CONNECTION=mysql
CLIENT_ONE_DB_HOST=127.0.0.1
CLIENT_ONE_DB_PORT=3306
CLIENT_ONE_DB_DATABASE=client_one_db
CLIENT_ONE_DB_USERNAME=root
CLIENT_ONE_DB_PASSWORD=
# Database: Client 2
CLIENT_TWO_DB_CONNECTION=mysql
CLIENT_TWO_DB_HOST=127.0.0.1
CLIENT_TWO_DB_PORT=3306
CLIENT_TWO_DB_DATABASE=client_two_db
CLIENT_TWO_DB_USERNAME=root
CLIENT_TWO_DB_PASSWORD=
在config/database.php
文件中,添加数据库。
'client_one' => [
'driver' => 'mysql',
'url' => env('CLIENT_ONE_DATABASE_URL'),
'host' => env('CLIENT_ONE_DB_HOST', '127.0.0.1'),
'port' => env('CLIENT_ONE_DB_PORT', '3306'),
'database' => env('CLIENT_ONE_DB_DATABASE', 'forge'),
'username' => env('CLIENT_ONE_DB_USERNAME', 'forge'),
'password' => env('CLIENT_ONE_DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'client_two' => [
'driver' => 'mysql',
'url' => env('CLIENT_TWO_DATABASE_URL'),
'host' => env('CLIENT_TWO_DB_HOST', '127.0.0.1'),
'port' => env('CLIENT_TWO_DB_PORT', '3306'),
'database' => env('CLIENT_TWO_DB_DATABASE', 'forge'),
'username' => env('CLIENT_TWO_DB_USERNAME', 'forge'),
'password' => env('CLIENT_TWO_DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
我创建了一个用于在/config/connection.php
处设置连接的配置文件,如下所示...
<?php
$domain = request()->getHttpHost();
$domain_parts = explode('.', $domain);
$subdomain = $domain_parts[0];
if ($subdomain == 'clientone') {
config()->set('database.default', 'client_one');
}
if ($subdomain == 'clienttwo') {
config()->set('database.default', 'client_two');
}
return ['subdomain' => $subdomain];
就是这样。我不必弄乱路由或中间件,它们都面临着更深层次的挑战。这种方法使所有事情变得简单而独立。
此外,通过在配置中返回subdomain
,您将可以在应用程序的其他位置访问该常量。因此,例如,在刀片文件中,如果要让应用程序的导航栏徽标区域显示客户端名称,则可以使用...
{{ config('connection.subdomain') }}
这是我经过大量研究后选择做的。希望这种方法可以帮助其他人做我尝试做的事情。