我可以在Laravel中集成自定义PDO包装器吗 [英] Can I integrate a custom PDO wrapper in Laravel

查看:111
本文介绍了我可以在Laravel中集成自定义PDO包装器吗的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的同事和我正在尝试使用Laravel和Vertica数据库开发Web应用程序.唯一的问题是,一旦对此特定数据库使用bindValue或bindParam,PHP就会由于分段错误而崩溃.因此,我编写了一个PDO包装器类,该类将调用重定向到PHP_ODBC模块,并且可以正常工作.我现在想知道是否有可能将其集成到Laravel中.

My fellows at work and I are trying to develop a web application using Laravel with a Vertica database. The only problem is that as soon as you use bindValue or bindParam with this specific database, PHP crashes with a segmentation fault. So I've written a PDO wrapper class that redirects calls to the PHP_ODBC module and that actually works. I was now wondering how to integrate it in Laravel if such a thing is even possible.

推荐答案

好的,因此,经过大量的试验和错误,我和我的同事们设法使事情顺利进行并开始运行.事实证明,最耗时的部分是构建包装器.假设您已经拥有了,这就是将其集成到Laravel中所需要做的(顺便说一下,这些步骤适用于Laravel 5.1).另外,我的包装器称为PDOVertica,因此每当您看到此术语时,都必须用它代替自己的包装器名称.

Okay so after a lot of trial and error, my co-workers and I managed to get things up and running. The most time-consuming part turned out to build the wrapper. Assuming you have that, here's what you need to do to integrate it in Laravel (these steps are for Laravel 5.1 by the way). Also, my wrapper's called PDOVertica so whenever you see this term, you have to substitute it for the name of your own wrapper.

1)将包装器文件复制到以下文件夹:

1) Copy your wrapper file to the following folder:

vendor/laravel/framework/src/Illuminate/Database/Connectors

2)接下来,您需要修改几个文件:

2) Next, you need to modify a couple of files:

供应商\ laravel \ framework \ src \ Illuminate \ Database \ Connection.php

vendor\laravel\framework\src\Illuminate\Database\Connection.php

namespace Illuminate\Database;

use PDO;
use PDOVertica; //Add this line
use Closure;
use DateTime;
...
//Change the type of the first parameter to PDOVertica as follow

public function __construct(PDOVertica $pdo, $database = '', $tablePrefix = '', array $config = [])

vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connectors \ Connector.php

vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php

namespace Illuminate\Database\Connectors;
include 'clsPDOVertica.php'; //Add this line
use PDO;
use PDOVertica; //Add this line
...

public function createConnection($dsn, array $config, array $options)
{
    $username = array_get($config, 'username');
    $password = array_get($config, 'password');

    //Modify the return value to return your wrapper
    return new PDOVertica($dsn, $username, $password, $options);
}

vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connectors \ PostgresConnector.php

vendor\laravel\framework\src\Illuminate\Database\Connectors\PostgresConnector.php

protected function getDsn(array $config)
{

    extract($config);

    $host = isset($host) ? "Server={$host};" : '';

    // Modify this line so that it creates the Vertica DSN. 
    // It should look something like this.
    $dsn = "Driver=/opt/vertica/lib64/libverticaodbc.so;{$host}Database={$database}";

    if (isset($config['port'])) {
        $dsn .= ";port={$port}";
    }

    if (isset($config['sslmode'])) {
        $dsn .= ";sslmode={$sslmode}";
    }

        return $dsn;
}

vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connectors \ ConnectionFactory.php

vendor\laravel\framework\src\Illuminate\Database\Connectors\ConnectionFactory.php

namespace Illuminate\Database\Connectors;

use PDO;
use PDOVertica; //Add this line
use InvalidArgumentException;
...

// Modify the header of this function so that the $connection parameter
// is of type PDOVertica
protected function createConnection($driver, PDOVertica $connection, $database, $prefix = '', array $config = [])
{
    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]");
}

3)正确修改文件后,您要做的就是通过修改以下文件来正确配置Laravel以使用您的自定义连接:

3) Once the files have been properly modified, all you have to do is properly configure Laravel to use your custom connection by modifying the following file:

config/database.php

config/database.php

/*   |--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/

'default' => 'vertica',

...

'connections' => [

    'sqlite' => [
        'driver'   => 'sqlite',
        'database' => storage_path('database.sqlite'),
        'prefix'   => '',
    ],

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', ''),
        'database'  => env('DB_DATABASE', ''),
        'username'  => env('DB_USERNAME', ''),
        'password'  => env('DB_PASSWORD', ''),
        'port'      => '5433h',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

    //This is our custom connection
    'vertica' => [
        'driver'    => 'pgsql',
        'host'      => env('DB_HOST', '192.168.1.1'),
        'database'  => env('DB_DATABASE', 'mydb'),
        'username'  => env('DB_USERNAME', 'myuser'),
        'password'  => env('DB_PASSWORD', 'mypassword'),
        'port'      => '5433',
        'charset'  => 'utf8',
        'schema'  => 'myschema',
    ],

    'pgsql' => [
        'driver'   => 'pgsql',
        'host'     => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'port'      => '5433',
        'charset'  => 'utf8',
        'prefix'   => '',
        'schema'   => 'public',
    ],

    'sqlsrv' => [
        'driver'   => 'sqlsrv',
        'host'     => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'prefix'   => '',
    ],

],

据我所知,这是使Laravel连接到Vertica数据库而不会崩溃的所有步骤.我希望这会有所帮助.

So far as I could tell, this was all the steps needed to get Laravel to connect to a Vertica database without crashing. I hope this helps.

这篇关于我可以在Laravel中集成自定义PDO包装器吗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆