我何时在MVC(PHP)中创建数据库连接?

问题描述 投票:0回答:2

我是否在调用我继承的抽象类的基类中得到此?

class ConcreteClass extends MyAbstractClass(){
  public function __construct(){
    parent::__construct();  //or other method that returns my adapter, PDO in this case.
  }
}

或者,是否在创建的每个对象引用上获得新的适配器:

class ConcreteClass extends BaseClass(){  //or no class extension for that matter
  public function __construct(){
     public function __construct(DB $adapter) {  //or call DB on another class for DI via set/get
        $this->adapter = $adapter;
        $this->adapter->connect();
    }
  }
}

我将在创建每个对象的同时创建与数据库的新连接。这不好吗?除了单例(我不想使用)以外,我不知道另一种方法。

http请求->控制器->最终,我得到了我的对象,该对象每次创建对象时都会调用数据库new连接。

我已经创建了“ DB”类型的接口或抽象类,因此即使我已经在使用PDO,也可以根据需要更改数据源。

php database model-view-controller database-connection
2个回答
0
投票

您可以查看Laravel框架如何解决此问题-参见https://github.com/illuminate/database/blob/master/DatabaseManager.php。该DatabaseManager对象的AFAIK单个实例存储在Laravel ioc容器中。

我将通过创建的每个对象来创建与数据库的新连接。这不好吗?”-它取决于:

  1. 连接到远程计算机时,为每个对象创建新的连接可能会浪费时间/资源,尤其是当您有很多对象时]
  2. 您还可能达到某种最大连接限制,尤其是当嵌套类使用单独的连接时(也就是说,存储连接的对象的引用计数在脚本执行结束之前不会达到0)。
  3. AFAIK与事务相关的所有事物都只能在单个连接上运行,因此,当您使用单独的连接时,可以说在持久性层中,无法在服务层中使用事务逻辑。
  4. 还有恕我直言,如果您需要用PHP换出数据源,那么您已经搞砸了。 PDO是PHP必须提供的最好的工具,它一点也不好-它只为您提供持久的PHP API,您仍然需要手动转换所有供应商特定的SQL。


0
投票

您可以拥有db.php。

© www.soinside.com 2019 - 2024. All rights reserved.