[英]Opening database connection in controller (connection pattern)
我必须实现数据库连接模式。 我创建了两个类:
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的事实。 错了吗 我应该更改代码设计吗?
您根本在控制器中使用数据库是错误的。 如果从MVC体系结构模式谈论控制器,那么其模型工作就是与数据库进行交互。 控制器中应该只有模型的实例,而数据库应该没有。
基本上,在现代MVC框架中,模型正在扩展具有数据库实例化的基础模型类。
据我了解,由于要返回一些项目,因此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
,也不需要在MySQLService
每个方法中调用getAdapther()
。 取决于您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.