【问题标题】:Defining MySQL connection in Slim Framework?在 Slim 框架中定义 MySQL 连接?
【发布时间】:2019-01-21 06:45:43
【问题描述】:

我听到了关于 Slim 框架的好消息——这似乎很容易。除了没有任何教程涉及将 MySQL 信息放在哪里。

我看到类似$dbCon = getConnection();

但是我在哪里定义用户名/pw/db/host 等?

【问题讨论】:

标签: php slim


【解决方案1】:

首先让我们打开 src/settings.php 文件并将数据库连接详细信息配置到设置数组,如下所示。

<?php
return [
  'settings' => [
      'displayErrorDetails' => true, // set to false in production

      // Renderer settings
      ....
      ....    

      // Monolog settings
      ....
      ....

      // Database connection settings
      "db" => [
          "host" => "localhost",
          "dbname" => "slim3",
          "user" => "root",
          "pass" => "xxxxx"
      ],
   ],
];

有许多可用于 PHP 的数据库库,但此示例使用 PDO。现在打开您的 src/dependencies.php 文件并配置数据库库,如下所示。您可以通过修改示例来使用自己的库。

// DIC configuration
$container = $app->getContainer();

...
...
...

// PDO database library
$container['db'] = function ($c) {
    $settings = $c->get('settings')['db'];
    $pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'],
        $settings['user'], $settings['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $pdo;
};

通过:https://arjunphp.com/configure-load-database-slim-framework-3/

【讨论】:

    【解决方案2】:

    最好将这些凭据保存在本地配置文件中。我在 Web 根目录之外添加了一个 configs 文件夹,并向其中添加了一个 local.php 配置文件。

    ....
    /configs
        local.php
    /public
    /vendor
    ....
    

    您可以配置任何您喜欢的东西,但这里是 DB:

    <?php
    // configs/local.php
    return array(
        'db' => ['user' => 'root', 'password' => 'root']
    );
    

    然后将文件包含在您的应用中并创建连接:

    // public/index.php
    $config = include(__DIR__ . '/../configs/local.php');
    $db = new PDO("mysql:host=localhost;dbname=dbname", $config['db']['user'], $config['db']['password'] );
    
    $app->get('/', function () use ($app, $db) {
        // do something with your db connection
    });
    

    【讨论】:

      【解决方案3】:

      您可以在文件中定义一个函数(例如 index.php)

          function getConnection() {
          $dbhost="yourdbhost";
          $dbuser="yourdbuser";
          $dbpass="yourdbpass";
          $dbname="yourdb";
          $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);  
          $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          return $dbh;
          }
      

      【讨论】:

      • 我个人不喜欢这种方法,因为您最终会在源代码中获得凭据。我会将凭据移动到您的源代码管理忽略的 Web 根目录之外的本地配置文件。
      • 我同意 @ForrestLyman 的观点,数据库凭据在那里没有任何关系。
      • 这种方法不是最好的,我猜应该有一个.env文件
      【解决方案4】:

      我在这种 MVC 模式上取得了巨大成功,您将凭据存储在 config.php 文件中,该文件会加载到模型的每个实例上:https://github.com/revuls/SlimMVC

      【讨论】:

        【解决方案5】:

        您可以在外部类中配置 PDO:

         class Connection
            {
                protected $db;
                public function Connection()
                {
                $conn = NULL;
                    try{
                        $conn = new PDO("mysql:host=YOUR_HOST;dbname=DB_NAME;charset=utf8;collation=utf8_unicode_ci", "USER_DB", "PASS_DB");
                        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    } catch(PDOException $e) {
                        echo 'ERROR: ' . $e->getMessage();
                    }   
                    $this->db = $conn;
                }
        
                public function getConnection()
                {
                    return $this->db;
                }
            }
        

        然后在 Slim(面向 PHP 对象)中:

          <?php
        
           class Proxy
           {
            require_once 'Connection.php';
        
            // init Slim
        
            private $conn = NULL;
        
            // Api Rest code...
        
        
            # getConnection
            public function getConnection(){
                if(is_null($this->conn)){
                    $this->conn = new Connection();
                }
                return $this->conn->getConnection();
            }
        

        或者 PHP 没有 OO:

          <?php
        
            require_once 'Connection.php';
        
            // init Slim
        
            $conn = NULL;
        
            // Api Rest code...
        
        
            # getConnection
            function getConnection(){
                global $conn;
                if(is_null($conn)){
                    $conn = new Connection();
                }
                return $conn->getConnection();
            }
        

        【讨论】:

          猜你喜欢
          • 2021-04-01
          • 1970-01-01
          • 2013-02-17
          • 2018-02-08
          • 2015-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多