【问题标题】:Can I integrate a custom PDO wrapper in Laravel我可以在 Laravel 中集成自定义 PDO 包装器吗
【发布时间】:2015-09-04 03:29:50
【问题描述】:

我的同事和我正在尝试使用 Laravel 和 Vertica 数据库开发一个 Web 应用程序。唯一的问题是,一旦您对这个特定的数据库使用 bindValue 或 bindParam,PHP 就会因分段错误而崩溃。因此,我编写了一个 PDO 包装类,它将调用重定向到 PHP_ODBC 模块并且确实有效。我现在想知道如果这样的事情可能的话,如何将它集成到 Laravel 中。

【问题讨论】:

  • 尝试使用 pgsql 作为 Vertica 的连接类型。
  • 已经试过了,问题依旧。我还打开了一个关于 PHP 的错误,详细说明了这个问题,但我并不完全希望它会很快得到修复。
  • 有兴趣发表评论,你解决了吗?
  • @Alucard 我发布了详细的分步说明,详细说明了我们为启动和运行所做的工作。检查一下,如果我错过了什么,请告诉我

标签: php laravel pdo vertica


【解决方案1】:

好的,经过大量的试验和错误,我和我的同事设法让一切正常运行。结果发现,最耗时的部分是构建包装器。假设你有这个,这就是你需要做的将它集成到 Laravel 中(顺便说一下,这些步骤适用于 Laravel 5.1)。另外,我的包装器名为 PDOVertica,所以每当您看到这个术语时,您都必须将其替换为您自己的包装器的名称。

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

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

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

厂商\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

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

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

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 以使用您的自定义连接:

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 数据库而不会崩溃所需的所有步骤。我希望这会有所帮助。

【讨论】:

  • 这似乎不是一个好的答案,在下一次作曲家更新时,您将丢失所有更改。
  • 我同意。这就是我们提出替代解决方案的原因。详情请查看this post
  • @Osuwariboy 您能否发布您最终将 laravel 与垂直数据库的集成
  • @HemersonVarela 检查我在你上面的评论,有一个链接指向我的另一篇文章,它使用服务提供商实现了更好的实施。如果您决定使用 Vertica,我强烈推荐这篇文章
  • @Osuwariboy,你关于 Laravel+Vertical db 的(工作、经验、事实、一般意见)值得一篇完整的文章。 ;-)
【解决方案2】:

您可以使用我编写的 Laravel-ready PDO 连接器:

composer require mixartemev/dbal-vertica-driver

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 2021-04-05
    • 2017-11-09
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多