- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
浏览有关 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 Gateway和 Row 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.
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 Mappers
与
Zend_Db_Table 交互实例,它使用
表数据网关模式 .另一方面,
$this->getDbTable->find()
返回
Zend_Db_Table_Row 的实例,它实现了
行数据网关模式 (它是一个代表数据库行的对象)。
Tip: The
domain object
itself, theguestbook
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
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 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/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!