Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.4:根据Laravel中的子域更改DB_Php_Laravel - Fatal编程技术网

Php Laravel 5.4:根据Laravel中的子域更改DB

Php Laravel 5.4:根据Laravel中的子域更改DB,php,laravel,Php,Laravel,我正在创建一个带有单个laravel安装和多租户数据库的SAAS应用程序。 所以我有一个默认连接到laravel的主DB。客户端可以通过其子域访问应用程序,如:client1.example.com和client2.example.com 我在主数据库中保存客户端的所有信息,如域名和数据库名 如何根据子域更改数据库 我尝试了以下代码 在routes/web.php中 in-app/Providers\routeServiceProvider.php 然后我创建了一个ServiceProvider

我正在创建一个带有单个laravel安装和多租户数据库的SAAS应用程序。 所以我有一个默认连接到laravel的主DB。客户端可以通过其子域访问应用程序,如:client1.example.com和client2.example.com

我在主数据库中保存客户端的所有信息,如域名和数据库名

如何根据子域更改数据库

我尝试了以下代码

在routes/web.php中

in-app/Providers\routeServiceProvider.php

然后我创建了一个ServiceProvider ConfigServiceProvider

我使用的是Laravel 5.4。有人能指导我如何正确地做吗?

改变

use Illuminate\Support\Facades\Request;

不能将Facades用于依赖项/方法注入。希望它有助于改变

use Illuminate\Support\Facades\Request;


不能将Facades用于依赖项/方法注入。希望能有所帮助

这里有一些问题:

首先,服务提供者的register方法不应接受请求实例作为参数。最好这样写:

public function register()
其次,不要在laravel文档中的register方法中使用config:

在register方法中,您应该只将内容绑定到 服务容器。您不应尝试注册任何事件 侦听器、路由或 注册方法。否则,您可能会意外使用以下服务: 由尚未加载的服务提供商提供

IMHO我将使用中间件来更改数据库配置,就像您在服务提供商中尝试的那样,即:

public function handle($request, Closure $next)
{        
    $customer=$request->route('domain');
    if($customer)
    {
        config(['database.mysql.database' => $customer->customer_database]);
        DB::reconnect();
    }
    return $next($request);
}

如果您注意将中间件加载到正确的位置,请在app/Http/Kernel.php中查找,您将在任何查询之前更改数据库

这里有一些问题:

首先,服务提供者的register方法不应接受请求实例作为参数。最好这样写:

public function register()
其次,不要在laravel文档中的register方法中使用config:

在register方法中,您应该只将内容绑定到 服务容器。您不应尝试注册任何事件 侦听器、路由或 注册方法。否则,您可能会意外使用以下服务: 由尚未加载的服务提供商提供

IMHO我将使用中间件来更改数据库配置,就像您在服务提供商中尝试的那样,即:

public function handle($request, Closure $next)
{        
    $customer=$request->route('domain');
    if($customer)
    {
        config(['database.mysql.database' => $customer->customer_database]);
        DB::reconnect();
    }
    return $next($request);
}

如果您注意将中间件加载到正确的位置,请在app/Http/Kernel.php中查找,您将在任何查询之前更改数据库

我建议创建2个.env文件,每个子域一个,例如.env.domain1和.env.domain2

然后在应用程序服务提供商中:

public function boot() {      //Use boot for this  
    $fn = ".env.".$this->app->request->route('domain');
    $dotenv = new \Dotenv\Dotenv(self::basePath(), $fn);
    try {
        $dotenv->overload();
    } catch (\Dotenv\Exception\InvalidPathException $e) {
       //Nothing to overload with
    }
}

这会使您的子域表现得像不同的环境,看起来确实像您要做的。

我建议创建2个.env文件,每个子域一个,例如.env.domain1和.env.domain2

然后在应用程序服务提供商中:

public function boot() {      //Use boot for this  
    $fn = ".env.".$this->app->request->route('domain');
    $dotenv = new \Dotenv\Dotenv(self::basePath(), $fn);
    try {
        $dotenv->overload();
    } catch (\Dotenv\Exception\InvalidPathException $e) {
       //Nothing to overload with
    }
}

这会使您的子域表现得像不同的环境,看起来确实像您要做的。

每个子域都有单独的代码库吗?@SameerShaikh no我对所有数据库使用相同的代码。所有型号和控制器都是通用的数据库名称是什么?每个子域是否有单独的代码库?@SameerShaikh否我对所有数据库使用相同的代码。所有的模型和控制器都是通用的。数据库的名称是什么?我试过了,也没用。我已经在web.php中使用了一些路由组。你能告诉我在web.php中调用中间件的路由组是什么吗?检查是否设置了$customer,如果设置了$customer,则更改连接,我更新代码。好的,所以我在我的web.php文件route::group['domain'=>'{account}','middleware'=>'subdomain_setup'],function{};此外,我还使用了一个模型在请求->路由“域”后获取数据库详细信息,但仍然没有幸运的是,你把你的middlweare放在Kernel.php中了吗?是的,我在受保护的$routeMiddlewarei中做了,我尝试过,但也没有成功。我已经在web.php中使用了一些路由组。你能告诉我在web.php中调用中间件的路由组是什么吗?检查是否设置了$customer,如果设置了$customer,则更改连接,我更新代码。好的,所以我在我的web.php文件route::group['domain'=>'{account}','middleware'=>'subdomain_setup'],function{};此外,我还使用了一个模型在请求->路由“域”后获取数据库详细信息,但仍然没有幸运的是,您将middlweare放在Kernel.php中了吗?是的,我在受保护的$routeMiddle软件中做了
public function boot() {      //Use boot for this  
    $fn = ".env.".$this->app->request->route('domain');
    $dotenv = new \Dotenv\Dotenv(self::basePath(), $fn);
    try {
        $dotenv->overload();
    } catch (\Dotenv\Exception\InvalidPathException $e) {
       //Nothing to overload with
    }
}