我必须实现数据库连接模式。我创建了两个类:
的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这一事实。这是一个错误吗?我应该改变我的代码设计吗?
答案 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()
的每个方法中。取决于您的需求。