zoukankan      html  css  js  c++  java
  • Laravel 使用Voyager导致多个数据库连接总是返回默认连接?

    问题与分析

    最近的项目碰到一个奇怪的问题,在Laravel(5.3)中想建立多个数据库连接连到MySQL的不同数据库(另一个连接名为conn2),执行如下语句得到却发现得到的仍然是默认连接

    $conn2 = DB::connection("conn2");
    

    百思不得其解,只好去啃源码,最后定位到vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php文件的createConnection这个函数,源码如下:

    /**    
         * Create a new connection instance.                                                  
         *      
         * @param  string   $driver                                                          
         * @param  PDO|Closure     $connection
         * @param  string   $database                                                        
         * @param  string   $prefix                                                          
         * @param  array    $config
         * @return IlluminateDatabaseConnection                                            
         *                                                                                    
         * @throws InvalidArgumentException                                                  
         */
        protected function createConnection($driver, $connection, $database, $prefix = '', array $config = [])
        {
        	//以mysql为例,下面这句的意思就是如果检测到名为db.connection.mysql的Container,那么就返回该Container。测试发现总是进入该分支,也就是说明某个模块注册了该名称的Container以致不能创建多个连接。
            if ($this->container->bound($key = "db.connection.{$driver}")) {                  
                return $this->container->make($key, [$connection, $database, $prefix, $config]);    
            }
                                                                                              
            switch ($driver) {
                case 'mysql':                                                                
                    return new MySqlConnection($connection, $database, $prefix, $config);     
                case 'pgsql':  
                    return new PostgresConnection($connection, $database, $prefix, $config);  
                case 'sqlite':                                                                
                    return new SQLiteConnection($connection, $database, $prefix, $config);    
                case 'sqlsrv':
                    return new SqlServerConnection($connection, $database, $prefix, $config); 
            }
    
            throw new InvalidArgumentException("Unsupported driver [$driver]");               
        }
    

    问题就出在第一句的判断上,测试发现总是能进入分支,说明某个模块注册了提供了db.connection.mysql的Container。最后查到是由于安装了第三方包Voyager引起的。

    Voyager注册了一个名为LarapackDoctrineSupportDoctrineSupportServiceProvider(也不知道干嘛的,也没看到在使用),看下DoctrineSupportServiceProvider的源码,可以找到确实注册了db.connection.mysql的单例Container

       /**
         * Register MySQL database connection.
         */
        protected function registerMySqlDatabaseConnection()
        {
            $this->app->singleton('db.connection.mysql', function ($app, $parameters) {
                // First, we list the passes parameters into single
                // variables. I do this because it is far easier
                // to read than using it as eg $parameters[0].
                list($connection, $database, $prefix, $config) = $parameters;
    
                // Next we can initialize the connection.
                $connection = new MySqlConnection($connection, $database, $prefix, $config);
    
                // Add Doctrine types for better support
                $this->addDoctrineTypes($connection);
    
                $connection->setSchemaGrammar(new MySqlGrammar());
    
                return $connection;
            });
        }
    
    

    解决方法

    vendor/tcg/voyager/src/VoyagerServiceProvider.php复制一份到app/Providers/,修改命名空间为AppProviders,并将DoctrineSupport相关行都删除。然后修改下config/app.php,将TCGVoyagerVoyagerServiceProvider::class修改为AppProvidersVoyagerServiceProvider::class就解决了。

  • 相关阅读:
    MY_0003:设置界面显示单位
    H5_0024:对于事先无法确定css大小的情况,可以通过JS动态修改
    H5_0023:html页面禁止放大缩小页面
    MY_0002:导出单位设置
    MY_0001:添加命令到自定义工具栏
    H5_0020:判断安卓苹果平台
    Web_0003:关于PHP上传文件大小的限制
    H5_0019:JS中定义json结构
    H5_0018:z-index失效的原因
    H5_0017:通过元素自定义属性值获取元素对象,并获取属性值
  • 原文地址:https://www.cnblogs.com/pheye/p/6380436.html
Copyright © 2011-2022 走看看