我一直在研究和阅读很多关于在PHP中使用单独的层来创建可维护和可读的代码。 但是,我看到很多代码将实体和数据库访问放在一个类中。 例如:
class User{
public $id;
public $username;
public $database;
function add(){
$database->query ....
}
}
我觉得这很奇怪,因为在这里你将User类与数据库元素混合在一起,这使得维护起来更加困难。
我喜欢这样工作:
这样的工作原理如下:
$database = new Database();
$database->openConnection();
$dataUser = new DataUser($db);
$user = new User(1,"myname");
$dataUser->saveUser($user);
所以我想知道,我是以正确的方式工作还是第一种创建代码的更好方法? 我发现可能很容易维护,因为你有一个单独的实体和一个单独的数据库类来处理数据库操作。
答案 0 :(得分:1)
就我个人而言,我认为从UserData
中抽象User
可能是过度的。在这种情况下,UserData
可能与ProductData
非常相似 - 例如,他们仍然会包含add($data)
,find($id)
等。< / p>
在您的情况下,User
是MVC方法中的模型,并且完全可以包含数据库存储/检索逻辑。但是,您可能会再次在User
类中重新创建与其他模型中相同的数据库方法。您可以在这里开始查看ORM实现。因此,通用DB访问方法在抽象类中定义,然后所有模型都会根据需要进行扩展和覆盖。
答案 1 :(得分:1)
易于维护,因为您有一个单独的实体和一个单独的实体 数据库类
您似乎在说,您希望从Active Record方法转变为Data Mapper/Entity/Repository方法。这是一个很好的方向,因为它采用了更好的关注点分离。你可以自己构建这个,但是你可能想看看像Doctrine这样的解决方案,它允许你做一些事情:
$product = new Product();
$product->setName($newProductName);
$entityManager->persist($product);
$product
实体只是一个POPO(普通旧PHP对象),它包含记录数据并且不知道它是如何持久存在的,并且当需要持久性时,会传递给实体管理器来处理存储
答案 2 :(得分:1)
我做什么:
我的模型不是链接到数据库的实体(当我不使用学说时),因此没有“活动记录”方法。对象不知道如何获取其依赖项(例如,用户可能有n条注释,我的模型不知道如何获取注释)。
class User{
private $name;
private $password;
// getter and setters
}
我的服务包含一些可以从提供者处获取模型的业务逻辑,服务可以有许多提供者。
class UserService{
function __construct(IUserProvider $userProvider){
$this->userProvider = $userProvider
}
function getUsers(){
// return an array of user objects
return $this->userProvider->getUsers();
}
}
最后我有一个知道如何从数据库,文本文件,json文件,web服务请求数据的数据提供者:
class UserProvider implements IUserProvider{
function __construct(Connection $connection){
$this->connection = $connection;
}
function getUsers(){
return $this->toUsers($this->connection->fetchAssoc("Select * from users"));
}
function toUsers(array $datas){
// convert user records to an array of User
(...)
return $users;
}
}
然后是界面
interface IUserProvider{
/**@return array an array of User */
function getUsers();
}
如果我需要获得用户评论,那么我的评论服务知道如何从用户ID获取评论。因此,为了获得用户及其评论,我需要2个数据库请求。一个来自UserProvider,另一个来自CommentProvider。
所以我有3层:
我的图层沟通的唯一方式是通过模型我从一层传递到另一层。
我的所有类都是使用依赖注入容器构建的,因此布线不是问题。
以下是我制作的应用程序示例,它是开源的:https://github.com/Mparaiso/silex-bookmarkly
欢迎任何想法。