gpt4 book ai didi

php - Zend 框架数据访问层 (DAL)

转载 作者:行者123 更新时间:2023-12-04 18:13:57 27 4
gpt4 key购买 nike

浏览有关 Zend Framework 中数据访问的几本教程和书籍,似乎大多数人在他们的模型(事件记录模式)甚至 Controller 中进行数据访问。我强烈不同意这一点。因此,我想要一个数据访问层(DAL),这样我的域层就可以通过没有任何“ZF 的东西”来保持可移植性。我四处寻找,但并没有真正找到我想要的东西。注意:我是采埃孚的新手。

DAL结构

所以,第一个问题是在哪里放置数据访问层。虽然它当然可以放在 library 中文件夹并将命名空间添加到自动加载器,这似乎不合逻辑,因为它特定于我的应用程序(因此 applications 文件夹是合适的)。我正在使用模块化结构。我正在考虑使用以下结构:
/application/modules/default/dal/
但是,我不确定如何包含此文件夹,以便我可以访问 Controller 中的类(不使用包含/需要)。如果有人知道如何做到这一点,那就太棒了!当然也欢迎任何其他想法。

这个想法是让我的 Controller 与数据访问对象 (DAO) 交互。然后 DAO 使用可以返回给 Controller 的模型。通过这样做,我可以保持我的模型完好无损。

实现

在其他语言中,我之前已经为每个模型实现了 DAO,例如DAL_User .这导致了大量的 DAO 类。有没有更聪明的方法来做到这一点(使用单个类似乎并不容易使用外键)?

我也很感激有关如何在 ZF 中实现我的 DAO 类的建议。我没有花太多时间阅读所有可用于数据库交互的组件,因此非常欢迎任何想法。我怀疑有比可用的标准 PDO 更智能的东西(不过,它可能在内部使用 PDO)。名字下降就足够了。

很抱歉有很多问题。我只需要朝着正确的方向前进。

最佳答案

好吧,在处理 Data Access Layer 时首先要考虑的事情是, 是这层也有子层 ,在现代框架中找到名为“dal”的文件夹是不寻常的(我以 Zend Framework 和 Symfony 为基础)。

二、关于ActiveRecord ,您必须知道默认情况下 Zend Frameworks 没有实现 .大多数教程采用最简单的方法来教授新概念。举个简单的例子, 的数量业务逻辑 是最小的,因此它们不会增加另一层复杂性(数据库和模型对象之间的映射),而是组成 domain layer (型号)有两种基本模式:Table Data GatewayRow Data Gateway .对于初学者来说,这是足够的信息。

After analyzing it, you will see some similarity between ActiveRecord and Row Data Gateway patterns. The main difference is that ActiveRecord objects (persistable entities) carries business logic and Row Data Gateway only represents a row in the database. If you add business logic on a object representing a database row, then it will become an ActiveRecord object.



此外,遵循 Zend 框架 快速入门 , on the domain model section ,您会发现还有第三个组件,它使用 Data Mapper Pattern .

所以,如果你的主要目的 DAL是在业务对象(模型)和你的存储之间映射数据,这个任务的职责 委托(delegate)给数据映射器 如下:
class Application_Model_GuestbookMapper
{

public function save(Application_Model_Guestbook $guestbook);

public function find($id);

public function fetchAll();

}

这些方法将与 Database Abstraction Layer 交互。并用数据填充域对象。沿着这条线的东西:
public function find($id, Application_Model_Guestbook $guestbook)
{

$result = $this->getDbTable()->find($id);

if (0 == count($result)) {

return;

}

$row = $result->current();

$guestbook->setId($row->id)

->setEmail($row->email)

->setComment($row->comment)

->setCreated($row->created);

}

如您所见, Data MappersZend_Db_Table 交互实例,它使用 表数据网关模式 .另一方面, $this->getDbTable->find()返回 Zend_Db_Table_Row 的实例,它实现了 行数据网关模式 (它是一个代表数据库行的对象)。

Tip: The domain object itself, the guestbook entity, was not created by the find() method on the DataMapper, instead, the idea is that object creation is a task of factories and you must inject the dependency in order to achieve the so called Dependency Inversion Principle (DIP) (part of the SOLID principles). But that's another subject, out of the scope of the question. I suggest you to access the following link http://youtu.be/RlfLCWKxHJ0



映射的东西从这里开始:
$guestbook->setId($row->id)
->setEmail($row->email)
->setComment($row->comment)
->setCreated($row->created);

到目前为止,我想我已经回答了你的主要问题,你的结构如下:
application/models/DbTable/Guestbook.php
application/models/Guestbook.php
application/models/GuestbookMapper.php

因此,就像 ZF 快速入门中一样:
class GuestbookController extends Zend_Controller_Action
{

public function indexAction()

{
$guestbook = new Application_Model_GuestbookMapper();

$this->view->entries = $guestbook->fetchAll();

}

}

也许您想为数据映射器创建一个单独的文件夹。只是改变:
application/models/GuestbookMapper.php


application/models/DataMapper/GuestbookMapper.php

类(class)名称将是
class Application_Model_DataMapper_GuestbookMapper

我看到你想把你的 domain model objects 分开。成模块。也有可能,你只需要关注ZF的目录和 namespace guidelines for modules .

Final tip: I've spent a lot of time coding my own data mappers for finally realize that it's nightmare to maintain the object mapping when your application grows with a lot of correlated entities. (i.e Account objects that contain references to users objects, users that contain roles, and so on) It's not so easy to write the mapping stuff at this point. So I strongly recommend you, if you really want a true object-relational mapper, to first study how legacy frameworks perform such tasks and perhaps use it. So, take some spare time with Doctrine 2, which is the one of the best so far (IMO) using the DataMapper pattern.



而已。您仍然可以使用您的 /dal用于存储 DataMappers 的目录,只是 register the namespace ,以便自动装载机可以找到它。

关于php - Zend 框架数据访问层 (DAL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com