IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Laravel 动态切换数据库链接 -> 正文阅读

[PHP知识库]Laravel 动态切换数据库链接

1.问题背景

在我们的工作需求中,一般一个项目一份代码,链接一个数据库就足够了。

但是如果我们有多个车辆系统A,车辆系统B,车辆系统C,虽然名称不通,在客户眼中也是两个项目,但是其实这些项目在程序员的眼中是几乎相同的,可以复用同样的代码,只是一些参数不通,数据存储的配置不通,甚至表结构 字段都是相同的。

如果我们还是创建了A,B,C.....项目那么以后的维护成本也会越来越大,同步一个功能,就更改N份代码,是不是很累?

我们是否可以在一套代码内通过某个参数来区分数据库的链接?是否可以通过这个参数,切换某些配置项?

2.通过Laravel框架尝试

大概流程就是,我们可以通过设置一个全局的中间件,去做配置。

(1)新建一个不同数据库配置方法

首先新建一个放置公共函数的文件

touch app/helpers.php

?然后,修改composer.json文件

"autoload": {
     ...
     "files": [
            "app/helpers.php"
         ]
}

?修改保存后运行以下命令进行重新加载文件即可

composer dump-autoload

?然后在其中增加一下配置方法

if(!function_exists("databaseConnection")){

    function databaseConnection($airportIata){
        $connections = [
            'd1'=>[
                'driver' => 'mysql',
                'host' => 'xxxxxxxx',
                'port' => 'xxx',
                'database' => 'xxxx',
                'username' => 'xxxxx',
                'password' => 'xxxx',
                'prefix' => 'xxx',
            ],
             'd2'=>[
                'driver' => 'mysql',
                'host' => 'xxxxxxxx',
                'port' => 'xxx',
                'database' => 'xxxx',
                'username' => 'xxxxx',
                'password' => 'xxxx',
                'prefix' => 'xxx',
            ],
             'd3'=>[
                'driver' => 'mysql',
                'host' => 'xxxxxxxx',
                'port' => 'xxx',
                'database' => 'xxxx',
                'username' => 'xxxxx',
                'password' => 'xxxx',
                'prefix' => 'xxx',
            ],
        ];
        if(isset($connections[$airportIata])){
            return $connections[$airportIata];
        }else{
            return [];
        }
    }

(2)创建中间件

php artisan make:middleware ChangeDatabase

?

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Config;

class ChangeDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        /**
         * 根据传递参数的参数 链接不同的数据库
         */
        if (!$request->para) {
            return response()->json(['msg'=>'缺少参数']);
        }
        $con = databaseConnection($request->airportIata);
        if (!$con) {
            return response()->json(['msg'=>'缺少参数']);
        }

        Config::set('database.connections.mysql', $con);
        return $next($request);
    }
}

?并将该中间件注册到 kernel.php

protected $routeMiddleware = [

....

'db.change'=>ChangeDatabase::class


]

(3)建立路由,以及控制器

Route::get('user/{user}',"UsersController@user")->name('user');
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Auth\ResetPasswordController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class UsersController extends Controller
{


    public function __construct()
    {
      $this->middleware('db.change');
    }

    public function user(Request $request){

        $user = DB::table('user')->where('uid','=',$request->user)->first();
        dd($user);

    }

}

https://laravel6.test/user/234?pa=d1

访问本地环境地址,通过改变pa的值,即可链接不同的数据库。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 11:41:35  更:2021-09-01 11:41:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:29:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码