原则 2 中的代理人是什么?

2023-11-22

我刚刚读完所有 Doctrine 2 文档,我开始了自己的沙箱,我理解了大部分原理,但仍然有一个问题,我在文档中找不到任何完整的解释。

  1. 什么是Proxy课程?
  2. 我什么时候应该在实体上使用它们?

据我了解,代理类添加了一个层,让您可以向实体添加一些其他功能,但为什么要使用代理而不是在实体类中实现方法本身呢?


UPDATE

该答案包含有关代理对象和部分对象之间差异的错误信息。有关更多详细信息,请参阅@Kontrollfreak 的答案:https://stackoverflow.com/a/17787070/252591


只要您的查询未返回创建实体所需的所有数据,就会使用代理对象。想象一下以下场景:

@Entity
class User {
     @Column protected $id;
     @Column protected $username;
     @Column protected $firstname;
     @Column protected $lastname;

     // bunch of setters/getters here
}

DQL query:

SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id

正如你所看到的,这个查询没有返回firstname and lastname属性,因此您无法创建User目的。创建不完整的实体可能会导致意外错误。

这就是为什么 Doctrine 将创造UserProxy支持延迟加载的对象。当您尝试访问时firstname属性(未加载)它将首先从数据库加载该值。


我的意思是为什么我应该使用代理?

您应该始终像根本不使用代理对象一样编写代码。它们可以被视为 Doctrine 使用的内部对象。

为什么实体本身不能实现延迟加载?

从技术上讲,它可能是,但看看一些随机代理对象的类。它充满了肮脏的代码,呃。在您的实体中拥有干净的代码是件好事。

您能给我提供一个用例吗?

您正在显示最新 25 篇文章的列表,并且想要显示第一篇文章的详细信息。每个数据都包含大量文本,因此获取所有数据会浪费内存。这就是为什么你不获取不必要的数据。

SELECT a.title, a.createdAt
FROM Entity\Article a
ORDER BY a.createdAt DESC
LIMIT 25

$isFirst = true;
foreach ($articles as $article) {
    echo $article->getTitle();
    echo $article->getCreatedAt();

    if ($isFirst) {
        echo $article->getContent(); // Article::content is not loaded so it is transparently loaded 
                                     // for this single article.

        $isFirst = false;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原则 2 中的代理人是什么? 的相关文章

随机推荐

  • d3.js 构建矩形网格

    我正在尝试在 d3 js 中构建一个矩形网格 网格有 7 行 一周中的几天 和 24 列 一天中的小时 以下代码仅绘制 行 列 天0 小时0 第 1 天 1 小时 第 2 天 第 2 小时 第 3 天 第 3 小时 第 4 天 第 4 小时
  • R 分组显示所有因子水平的计数,即使 dplyr 为零

    set seed 1 dat lt data frame ID sample letters 50 rep TRUE dat gt group by ID gt summarise no rows length ID 我有上面的代码 它创建
  • 了解 Java 内存模型和垃圾收集 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我经常会收到很多学生或寻找
  • 从 GCE VM 分离启动磁盘

    我正在尝试从 GCE 虚拟机分离启动磁盘 由于虚拟机已停止 因此它应该允许我将其分离 但它返回此错误 UNSUPPORTED OPERATION Hot remove of the root disk is not supported 有什
  • 如何只加载最后一个分区的数据

    我有一些数据是这样分区的 data year 2016 month 9 version 0 data year 2016 month 10 version 0 data year 2016 month 10 version 1 data y
  • 以编程方式实例化 Sharepoint 中的 Web 部件页面

    是否有一种简单的方法可以使用对象模型或 Web 服务以编程方式将 Web 部件页面添加到 Sharepoint 站点 以这种方式创建列表和添加 Web 部件似乎很简单 但我找不到如何创建内容页面的示例 编辑 对于普通的 WSS 安装 不是
  • Java 中的加权线性回归

    有谁知道 Java 中的科学 数学库可以直接实现加权线性回归吗 类似于接受 3 个参数并返回相应系数的函数 linearRegression x y weights 这看起来相当简单 所以我想它存在于某个地方 PS 我尝试过弗兰尼根的图书馆
  • 将 12 小时日期/时间转换为 24 小时日期/时间

    我有一个制表符分隔文件 其中每条记录都有一个 12 小时格式的时间戳字段 月 日 年 时 分 秒 AM PM 我需要快速将这些字段转换为 24 小时时间 月 日 年 HH mm ss 最好的方法是什么 我在 Windows 平台上运行 但除
  • 既然延迟已从反应导航中删除,如何“延迟加载”选项卡导航器屏幕

    React navigation 的维护者已从库中删除了 lazy true 导致所有选项卡尝试立即渲染 并获取先前由 lazy 控制的内容 现在乱序触发 为了保持类似的功能 如何强制在选项卡屏幕上等待 以便在第一次获得焦点之前不加载或调用
  • 如何使用 ITranscriptLogger 和 TranscriptLoggerMiddleware 在 cosmos DB 中存储聊天记录

    我想使用 ITranscriptLogger 和 TranscriptMiddelWare 将整个聊天历史记录存储在 cosmos DB 中 但我很难做到这一点 我读过了这篇 MS 文章 但我想将其存储在 Cosmos DB 中而不是 Bl
  • 有兴趣制作一个 PHP 脚本,将 IP 地址从定义的起始地址递增到定义的结束地址

    我知道我可以通过首先使用 PHP 内置函数将 IP 地址转换为十进制表示法来轻松做到这一点up2long and long2ip 我只是希望能够使用标准 IP 地址表示法做同样的事情作为练习 我想的问题是这样的 给定一个起始IP地址 比如1
  • 可以不使用括号调用单参数Python函数吗? [复制]

    这个问题在这里已经有答案了 Python 文档指定 如果函数仅采用单个参数 则省略括号是合法的 但是 myfunction Hello 产生语法错误 那么 到底是怎么回事呢 EDIT 我读到的声明仅适用于生成器表达式 在只有一个参数的调用中
  • grep 自动忽略文件

    有什么方法可以使用 grep 在搜索某些内容时忽略某些文件 相当于 svnignore 或 gitignore 吗 我在搜索源代码时通常使用类似的东西 grep r something grep v ignore file1 grep v
  • 与 QLabel 和 QLineEdit 中的右侧文本对齐

    我有一个QLabel就在下面一个QLineEdit具有相同的尺寸和对齐属性 QLineEdit lineEdit new QLineEdit 999 lineEdit gt setFixedWidth 100 lineEdit gt set
  • jni 调用以自定义 java 接口作为参数的 java 方法

    我正在cocos2d x平台上开发一个插件项目 我想编写一些c 包装器接口来通过调用java方法JNI from jar软件开发工具包 我知道如何使用 JNI 调用静态 java 方法 但我对 java 函数中的接口参数感到困惑 我有一个处
  • 重复字符在 PowerShell 中不起作用

    我想在 PowerShell 中重复一个字符 例如 test this is a test that I want to underline with Write Host test Write Host test length 然而 上述
  • npm 以一种奇怪的递归方式安装依赖项

    I used npm install dev安装a中列出的依赖项package json文件 似乎不是以平面结构安装所有包 而是在模块目录中安装每个模块的依赖项 我不得不取消它 因为它花了很多时间 因为许多依赖项应该已经得到满足 但它必须在
  • 使用 Mockito 进行 Retrofit 2 api 调用的单元测试

    我需要一些关于如何模拟 Rest api 的建议 我的应用程序采用 MVP 架构 我的API接口 public interface MyAPI GET cmd userName password Observable
  • python 中浮点数末尾的后缀 e+number 是什么意思? [复制]

    这个问题在这里已经有答案了 I use random uniform 1 2 100 产生范围内的随机浮点数 0 2 100 一些结果是 gt gt gt random uniform 1 2 100 5 9798650563331964e
  • 原则 2 中的代理人是什么?

    我刚刚读完所有 Doctrine 2 文档 我开始了自己的沙箱 我理解了大部分原理 但仍然有一个问题 我在文档中找不到任何完整的解释 什么是Proxy课程 我什么时候应该在实体上使用它们 据我了解 代理类添加了一个层 让您可以向实体添加一些