Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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
Laravel配置::通过请求设置持久化?_Laravel_Request_Config_Laravel 5.3 - Fatal编程技术网

Laravel配置::通过请求设置持久化?

Laravel配置::通过请求设置持久化?,laravel,request,config,laravel-5.3,Laravel,Request,Config,Laravel 5.3,我一直在构建一个跟踪统计数据的web应用程序。 这些统计数据可以在不同的公司之间变化。 我决定使用一个主数据库来存放所有登录凭据,每个公司都有一个单独的数据库。 用户登录后,他们将被重定向到此功能 /** * Redirects the user to the appropriate sub link */ public function redirect() { Config::set('database.connections.club.database', Auth::user()

我一直在构建一个跟踪统计数据的web应用程序。 这些统计数据可以在不同的公司之间变化。
我决定使用一个主数据库来存放所有登录凭据,每个公司都有一个单独的数据库。
用户登录后,他们将被重定向到此功能

/**
* Redirects the user to the appropriate sub link
*/
public function redirect()
{
    Config::set('database.connections.club.database', Auth::user()->club->db_name);
    if (Auth::user()->person->role_id == 4) {
        return Redirect::to('employee/club_manager/home');
    }
}
此函数用于将名为club's database的辅助数据库配置设置为等于用户关联的club

但是,当我稍后尝试访问此配置时

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request $request
* @param  \Closure $next
* @return mixed`enter code here`
*/
public function handle($request, Closure $next)
{
    dd(Config::get('database.connections.club.database'));
    if (Auth::user()->role->id == 4)
        return $next($request);
}
dd()将返回“”,这是我在database.php文件中设置的默认设置


我的问题是,如何跨请求保存配置设置,因为Config::set似乎只保存单个请求的设置。

好吧,您不能实际使用Config来完成此操作

在运行时设置的配置值仅为 当前请求,并且不会结转到后续请求

Laravel文档

解决方法

如果您不愿意使用主数据库来存储公司数据库连接数据,可以使用自定义配置文件,在运行时进行更新

这与原始配置文件的工作方式非常相似,它应该持久地保存数据。但是,您必须围绕它构建一个控制机制,以保持条目的唯一性和一致性:


你也可以为它找一个包,这样你就不必再发明轮子了。检查(免责声明:从未亲自使用过)。

在OP的请求之后,我提交了第二个答案,作为另一种方法

如果这仅用于数据库连接详细信息,那么可以在单个Laravel应用程序中对多个数据库连接使用以下方法

在app/config/database.php中定义两个不同的连接。一个用于存储
用户
表的主数据库,一个用于每个客户端实例的动态数据库:

'default' => 'mysql_main',
'connections' => [

    'mysql_main' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],

    'mysql_company' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => Auth::user()->club->db_name,
        'username' => Auth::user()->club->db_user,
        'password' => Auth::user()->club->db_pass,
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],

],
正如您所见,您实际上不需要从配置文件中读取第二个连接的连接详细信息(它仍将用于获取主机、端口和主数据库的任何常见详细信息),您可以从登录用户动态传递不同的连接详细信息。但是,这需要您事先为每个用户创建所有数据库

在成功连接到两个数据库之后,您必须在执行查询时选择活动连接

希望Schema Builder、Query Builder和Eloquent能够支持这一开箱即用的功能:

Shema建筑商

Schema::connection('mysql_company')->create('statisticA', function($table)
{
    $table->increments('id'):
});
$companyStatA = DB::connection('mysql_company')->select(...);
class SomeController extends BaseController {

    public function someMethod()
    {
        $statA = new StatisticA;

        $statA->setConnection('mysql_company');

        $something = $statA->find(1);

        return $something;
    }

}
查询生成器

Schema::connection('mysql_company')->create('statisticA', function($table)
{
    $table->increments('id'):
});
$companyStatA = DB::connection('mysql_company')->select(...);
class SomeController extends BaseController {

    public function someMethod()
    {
        $statA = new StatisticA;

        $statA->setConnection('mysql_company');

        $something = $statA->find(1);

        return $something;
    }

}
雄辩的模型

class StatisticA extends Eloquent {

    protected $connection = 'mysql_company';

}
控制器

Schema::connection('mysql_company')->create('statisticA', function($table)
{
    $table->increments('id'):
});
$companyStatA = DB::connection('mysql_company')->select(...);
class SomeController extends BaseController {

    public function someMethod()
    {
        $statA = new StatisticA;

        $statA->setConnection('mysql_company');

        $something = $statA->find(1);

        return $something;
    }

}
然而,棘手的是定义存储在不同数据库中的模型之间的关系。这是可能的,但这在很大程度上取决于您的数据库驱动程序和设置


我怀疑它是否能在不同类型的数据库之间正常工作(例如,MySQL作为您的主数据库,PostgreSQL用于您的公司数据库),因此,我建议您继续使用MySQL,看看情况如何。

为什么不将这些数据库详细信息与用户凭据一起存储在主数据库中?您可以使用其中一个软件包,在运行时将数据保存到配置文件中。以下是其中一个包:您的意思是什么?您可以在主数据库的
users
表中创建一个名为“database”的新列,您可以在其中存储该用户/公司的数据库实例的名称。如果需要单独的答案,请告诉我。你能单独回答吗?我真的不知道该如何解决这个问题。(我自学了所有知识,对SQL非常陌生)有什么想法可以让我完成我想做的事情吗?这就是我想要的,但是当我这样做时,我会出现以下错误。。。致命错误:在第73行的F:\trapstats\u v5\config\database.php中找不到类“Auth”。