打开控制器中的数据库连接(连接模式)

时间:2013-12-18 09:36:49

标签: php design-patterns database-connection

我必须实现数据库连接模式。我创建了两个类:

  • 的ConnectionFactory
  • MySQLService

的ConnectionFactory:

<?php

  class ConnectionFactory {
    protected static $connection;

    public function getConnection() {
        if (!self::$connection) {
            self::$connection = new PDO('mysql:host=localhost;dbname=sapienter', "root", "admin");
        }
        return self::$connection;
    }
  }

?>

MySQLService:

<?php

  class MySQLService {
    protected $connectionFactory;

    public function __construct(ConnectionFactory $factory) {
      $this->connectionFactory = $factory;
    }

    public function listItemsForSharerSQL() {
      $conn = $this->connectionFactory->getConnection();
      $items = ...
      return $items;
    }
  }

?>

我在控制器 ItemController

中调用这些方法
<?php

require_once ROOT_DIR . "/models/Item.php";
require_once ROOT_DIR . "/ConnectionFactory.php";
require_once ROOT_DIR . "/MySQLService.php";

class ItemController {

    private $data;

    public function listItemsForSharer() {
        $connFactory = new ConnectionFactory();
        $service = new MySQLService($connFactory);
        $items = $service->listItemsForSharerSQL();

        $this->data = ['items' => $items];
        return 'itemslistforsharer-view';
    }
}

?>

我不喜欢我必须在我的Controller中实例化一个新的ConnectionFactory这一事实。这是一个错误吗?我应该改变我的代码设计吗?

1 个答案:

答案 0 :(得分:3)

完全在控制器中使用数据库是错误的。如果从MVC架构模式谈论Controller,那么它的Models工作与数据库交互。控制器中应该只有模型的实例,而不是数据库的实例。

基本上在现代MVC框架中,Models正在扩展基础Model类,它具有数据库的实例化。

据我所知,MySQLService就像一个模型,因为你正在返回一些项目,看起来你正在进行数据库操作,并希望从控制器处理它。您应该使用基类,而不是每个模型都有自己的构造函数。我会建议像:

class Model {

    protected function getAdapter() {
        $connection = new ConnectionFactory();
        return $connection->getConnection();
    }

}


class MySQLService extends Model {

    public function listItemsForSharerSQL() {
      $this->getAdapter();
      $items = ...
      return $items;
    }
}

所以现在你的控制器只需要

$service = new MySQLService();

当然你的基类可以使用getAdapter()方法作为构造函数,没有任何参数,所以你不需要将任何内容传递给MySQLService,也不需要调用{{1在getAdapther()的每个方法中。取决于您的需求。