如何使用 Symfony2 和 Doctrine 2 及其设计模式制作具体的复杂模型逻辑?

2024-03-08

Problem具体的

我有一个对象 A(实体),它操纵一些公司(实体), 公司可以链接在一起(如果它们有共同股东) 例如)。我希望 A 能够知道公司 C1 是否是 与公司 C2 关联。

Feelings

根据我的知识和习惯,我认为公司实体中应该有一种方法来判断它是否与另一个实体有联系(point 1)。当然,我可以通过获取所有公司连接来做到这一点,并查看我的公司 C2 是否在其中(point 2)。但这很脏,这意味着出于什么原因获取所有依赖项?获得一个可以轻松从数据库中检索的布尔值,我可以考虑在与公司链接的存储库中创建一个函数(point 3)。但不行,因为实体(A 或 C1 和 C2)中没有任何可用的东西,轻量级对象会记住。

论证

  • 第 1 点基于单一职责原则。请随意批评这一点。由于实体应该嵌入模型逻辑,我认为 isConnectedWith 函数应该在 CompanyEntity 的定义中正确。请记住这里 A 也是一个实体(所以这里也是存储库)
  • 第 2 点是一个解决方案,从某种意义上来说它很好:这是正确的方法,如果,这是一个很大的如果,教义只是模拟的是真实的;如果只是打电话$object->connexions访问内存中某处已经存在的一些对象集合。但事实是可怕的:它不在那里,它存在于我们的 web 应用程序的常见瓶颈:数据库。
  • 第 3 点 我厌倦了数据映射器和依赖注入组合告诉你的实体(和一些存储库)应该只靠自己生存,因为它们是模型逻辑。也许我的理解是非常错误的,但由于每个人都说这是一件坏事,所以我完全放弃了在实体中注入助手或配置的想法。

问题

您将如何解决保持完整性和性能并避免肮脏的解决方法的问题?我的论证中哪些观点是不好的?


我们来分析一下你的观点

Point 3

第3点根本不是解决方案!谁告诉你注入的差不多把一切都变成实体并不是一个好的解决方案,但却是绝对正确的。这几乎是面向对象和模式编程最佳实践的“事实上的标准”。
实体在那里only代表一个“对象”(当然,这不是 IT 接受的范围!),因此,属性和访问器方法是您必须包含的唯一内容。
考虑一下这样一种情况,您注入的东西可能会随着时间而变化(方法签名、方法返回类型或逻辑):在这种情况下,您必须更改实体本身以保持事物协同工作,但为什么您必须这样做实体,没有改变吗?深入思考它,因为这是 OO 编程的一个很好的起点(不仅仅是 symfony2 或实体表示!)

Point 2

是的,你是对的:为什么要从数据库中获取所有实体,或者如果你编写了一个“好的”查询,只获取你正在搜索的实体(如果你永远不会使用它)?
关于这一点,你必须分析如下:

  • 我是否必须在其他地方使用这个(或那些)实体,所以获取它可能会很好?
  • 我是否知道 Doctrine2 会在内存中保存他获取对象(*)的位置?这意味着,当您查询(或询问)先前获取的同一对象时,他会向您返回该对象的相同实例吗?因此,没有数据库连接,没有 fecth,没有重量级操作。

Point 1

是的,这是一个好点。您必须实现(当然是在存储库中!)类似的方法->isThere()或者更好的东西(这是我想到的第一个名字)。
使用此方法,您可以编写自定义 SQL(称为DQL,其中D代表 Doctrine),您仅返回一个标志或一个整数(通过以下方式获得)COUNT(*)或类似的聚合函数)。
对于获取不是ArrayCollection实体但标量结果,顾名思义,使用$query->getSingleScalarResult();
我想我会倾向于最后一个解决方案。

希望已经解释清楚了


(*) 这就是所谓的恒等映射 http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#entities-and-the-identity-map

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

如何使用 Symfony2 和 Doctrine 2 及其设计模式制作具体的复杂模型逻辑? 的相关文章

  • @UniqueConstraint 和 @Column(unique=true) 选项之间的 Doctrine ORM 级别差异

    在数据库级别 使用一个选项与另一个选项来定义时没有区别独特性如下所示 虽然 UniqueConstraint在其文档中读取 它仅在 SchemaTool 模式生成上下文中有意义 两者之间是否存在 ORM 级别差异 我的意思是 当我们运行查询
  • Symfony 2.7 / 3 - Doctrine:您请求了一个不存在的服务“fos_user.doctrine_registry”

    今天做作曲家更新时突然出现以下错误 Symfony Component DependencyInjection Exception ServiceNotFoundException 您请求了一项不存在的服务 fos user doctrin
  • phpunit --debug 仍然只显示点

    我想查看 phpunit 运行期间当前执行的测试 我用 debugparam 但仍然只得到点 phpunit debug PHPUnit 3 7 19 by Sebastian Bergmann Configuration read fro
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • PHP:会话 |无法解码会话对象

    我尝试将电子商务功能添加到遗留项目中 因此我仍然需要旧的会话处理程序 我使用 PHP v7 1 14 和 Session2DB https github com voku session2db tree 4 0 0 https github
  • 如何定义/传递 sonata-admin 的实体管理器

    我跟着本教程 http symfony2 ylly fr sonataadminbundle fosuserbundle have a good base project jordscream 使用 FOSUserBundle 安装 Son
  • 配置 KnpPaginator 以与 Twitter Bootstrap 配合使用

    i m trying to apply twitter bootstrap css style to my knp pagination without modifying the vendor Is there a way to conf
  • symfony2 FOSRestBundle 注释

    有人在控制器中使用过 put get post delete 注释 https github com FriendsOfSymfony FOSRestBundle blob master Controller Annotations 吗 我
  • 工厂模式和策略模式

    我需要创建一个类来负责结果集处理 但可能会发生应该使用不同的算法来处理该结果集的情况 我知道以下选项 1 使用策略模式 伪代码如下 interface Strategy processResultSet ResultSet rs class
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 如何使用多个数据库设置 symfony 3 学说迁移?

    我在验证和更新模式时努力让 symfony doctrine 排除数据库视图 我第一次尝试没有教条迁移 看到这个问题 https stackoverflow com questions 46775200 symfony 3 doctrine
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr
  • 运行 Composer 返回:“无法打开输入文件:composer.phar”

    我是 symfony2 和阅读新手symblog http tutorial symblog co uk tutorial parts 在第三章中 在尝试使用数据装置时 我尝试了以下命令 php composer phar update 但
  • symfony api 平台深度

    到目前为止 我们一直在 Symfony Doctrine 和 Serializer 深度方面苦苦挣扎 我希望能够使用 Symfony 提供一级深度的 JSON REST API 从而允许我直接从视图管理我的 外键 和关系逻辑 GET peo
  • Azure 上的“phpcomposer.phar install”出现“无法终止进程”错误

    我正在尝试将我的 Symfony 2 应用程序部署到 Microsoft Azure 网站云 为此 我按照本指南中的步骤操作http symfony com doc current cookbook deployment azure web
  • 使用接口或函数对象进行回调? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在面向对象中 通常使用接口来实现回调 粗略示例 class Message class IMsgProcessor public virtual
  • Doctrine DQL 从 join 返回平面数组

    我通过 DQL 中的常规 LEFT JOIN 选择 3 个实体 它们通过连接表关联 连接表还定义了实体以及带注释的关系 查询执行没有问题 但我的结果作为平面数组返回 我期望一个包含三个实体作为每个索引的数组元素的数组 SELECT e1 e
  • C# 扩展方法 - 设计模式

    我想知道 C 扩展方法是否基于任何现有的设计模式 设计模式只是一种众所周知的范例 即 当你想实现 X 时 就做 Y 面向对象语言 例如 C 中的一个众所周知的范例是 当您想要对对象的状态进行操作时 调用它的实例上的方法 但是 在创建扩展方法
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 用户区域设置在第一次请求时不起作用

    我的网站运行的是 Symfony 主版本 到目前为止 我能够使用本地监听器逻辑 http symfony com doc master cookbook session locale sticky session html来自网站 由于代码

随机推荐

  • Rails rspec 设置子域

    我正在使用 rSpec 来测试我的应用程序 在我的应用程序控制器中 我有一个像这样的方法 def set current account current account Account find by subdomain request s
  • adwords api:检索每日支出(费用)

    有人有一些示例代码来说明如何获取 AdWords 帐户的每日总支出 所有广告系列 吗 我无法找到以简单的方式执行此类操作的示例代码 因此任何帮助 指针 代码将不胜感激 我将使用 python 库 但任何其他语言也很酷 提前致谢 Hoff 我
  • 无法在 Xcode 中找到设备支持文件[重复]

    这个问题在这里已经有答案了 在我的设备中运行我的应用程序时 我在 Xcode 中遇到以下错误 Xcode 版本为 10 01 我的设备 iOS 版本为 12 2 iPhone 5S 无法找到设备支持文件 您需要将 Xcode 更新到最新版本
  • 模块“rxjs”没有导出成员“firstValueFrom”

    App service 文件如下所示 import Injectable from nestjs common import HttpService from nestjs axios import Observable firstValu
  • 使用失败、回溯 Prolog 查找列表的最小值

    我想使用导致回溯的失败来计算列表的最小值 我如何改变分钟 分钟 X 分钟 以使其工作 min X A B X is the min of A B min X X Y X lt Y min Y X Y Y lt X member X X me
  • 使用隐藏代码在 WPF 中缩放画布

    这里的场景是 我有一张画布 上面画着不同的图表 现在的要求是使用 C 或 VB 使用背后的代码放大画布 此外 我需要将缩放代码放置在某个 dll 中 以便我可以在我的应用程序中重复使用同一组代码 现在我的问题是如何做到这一点 我已经尝试过以
  • 如何在 bootstrap4 中添加自定义断点以及如何在 scss 中使用响应式断点混合

    我正在开发一个 Angular 5 应用程序 它需要是一个响应式应用程序 我面临着使其响应的问题1366X768 and 1920X1080字体大小不同的分辨率 问题一 我在 style scss 中覆盖了断点 如下所示 grid brea
  • 从 C 函数返回数组

    我编写了一个返回数组的函数 虽然我知道我应该返回一个动态分配的指针 但我仍然想知道当我返回在函数内部本地声明的数组 不将其声明为静态 时会发生什么 当我注意到函数中内部数组的内存没有被释放时 我感到很惊讶 并且我将数组返回到主函数 主要的
  • Linux Azure Web 应用上的 Puppeteer

    我正在尝试在 Linux Azure Web Apps 上运行 Puppeteer 但日志显示 node modules puppeteer local chromium linux 782078 chrome linux chrome 加
  • Rails:每个http请求都会创建一个新的连接池吗?

    我正在读这篇文章https polycrystal org posts 2012 05 25 active record connection pool fairness html https polycrystal org posts 2
  • <应用程序名称>.pch 文件使用情况

    pch文件的重要性是什么以及 ifdef的意义是什么OBJC 另外 我们在哪里定义像 ifdef IS Production 这样的参数 这些参数在 pch 文件中检查 pch 文件允许您避免导入 UIKit h 和 Foundation
  • 在 Swing 中显示动画 BG

    动画 循环 GIF 可以显示在JLabel或者在 HTML 中 在格式化文本组件中 例如JEditorPane 并被视为循环 但是要加载图像以绘制为容器的背景 我通常会使用ImageIO read or Toolkit getImage 后
  • 转义动态sqlite查询?

    我目前正在根据用户的输入构建 SQL 查询 可以在此处查看如何完成此操作的示例 def generate conditions table name nameValues sql u for field in nameValues sql
  • 从 AppDomain.AssemblyLoad 事件引发异常

    有人可以向我解释为什么我似乎无法从 AppDomain Assembly 加载事件内部抛出异常吗 例如 class Program static Program AppDomain CurrentDomain UnhandledExcept
  • if语句可以作为函数调用来实现吗?

    我发现在已发布的代码中有点令人恼火的风格 惯例 之一是使用 if condition 而不是 我的偏好 if condition 略有不同 而且可能并不重要 但我突然想到 如果 if 语句作为一种函数调用实现 则第一种风格可能是合理的 然后
  • 当 flutter 应用程序处于后台时,通知不会在发布模式下发出

    void main async WidgetsFlutterBinding ensureInitialized await GetStorage init await Firebase initializeApp await PushNot
  • MUI DataGridPro useResizeContainer - 网格的父级具有空宽度

    我恳求你帮助我 因为我已经寻找答案三天了 但我无法解决这个问题 Problem MUI useResizeContainer 网格的父级具有空宽度 您需要确保容器具有固有宽度 网格显示的宽度为 0px 描述这是我的表格的屏幕截图 它放置在
  • DocumentDB - 较新的会话令牌是否保证读回较旧的写入?

    假设我在同一个集合 分区中有两个文档 都处于 版本 1 A1 B1 我更新A1 gt A2 写操作返回一个会话令牌SA Using SA阅读文档A将保证我得到版本A2 现在我更新了B1 gt B2 并获取新的会话令牌SB Using SB阅
  • 从通过 JDBC 调用的 PL?SQL 函数返回表类型?

    我有以下我想调用的函数 CREATE OR REPLACE PACKAGE utils AS TYPE item list IS TABLE of items item id TYPE FUNCTION getParentsForItem
  • 如何使用 Symfony2 和 Doctrine 2 及其设计模式制作具体的复杂模型逻辑?

    Problem具体的 我有一个对象 A 实体 它操纵一些公司 实体 公司可以链接在一起 如果它们有共同股东 例如 我希望 A 能够知道公司 C1 是否是 与公司 C2 关联 Feelings 根据我的知识和习惯 我认为公司实体中应该有一种方