DRY:如何在 Symfony2 项目的多个实体中使用此代码?特质?

2024-04-25

我有一段重复的代码,将在我的 Symfony2 项目中的多个实体中使用,因此应用某种 DRY 就可以了,当然如果可能的话,我正在考虑PHP 特性 http://php.net/manual/en/language.oop5.traits.php.

private static $preDeletedEntities;// static array that will contain entities due to deletion.
private static $deletedEntities;// static array that will contain entities that were deleted (well, at least the SQL was thrown).

/**
 * This callback will be called on the preRemove event
 * @ORM\PreRemove
 */
public function entityDueToDeletion()
{
    // This entity is due to be deleted though not deleted yet.
    self::$preDeletedEntities[] = $this->getId();
}

/**
 * This callback will be called in the postRemove event
 * @ORM\PostRemove
 */
public function entityDeleted()
{
    // The SQL to delete the entity has been issued. Could fail and trigger the rollback in which case the id doesn't get stored in the array.
    self::$deletedEntities[] = $this->getId();
}

public static function getDeletedEntities()
{
    return array_slice(self::$preDeletedEntities, 0, count(self::$deletedEntities));
}

public static function getNotDeletedEntities()
{
    return array_slice(self::$preDeletedEntities, count(self::$deletedEntities)+1, count(self::$preDeletedEntities));
}

public static function getFailedToDeleteEntity()
{
    if(count(self::$preDeletedEntities) == count(self::$deletedEntities)) {
        return NULL; // Everything went ok
    }

    return self::$preDeletedEntities[count(self::$deletedEntities)]; // We return the id of the entity that failed.
}

public static function prepareArrays()
{
    self::$preDeletedEntities = array();
    self::$deletedEntities = array();
}

这是我想到的代码:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\HasLifecycleCallbacks()
 */
trait DeleteLifeCycleCallbacksTrait
{
    // write things here
}

但是注释会应用于实体吗?可以吗?为了避免不重复代码,你会做什么?

编辑:试图找到最佳方法

有一些想法来自@Cerad用户,因为正如文档所说生命周期事件监听器比简单的生命周期回调更强大然后我就开始和他们一起玩。

那么,首先,我们这样做的目的Lifecycle Callbacks|Listener|Suscribers将存储每个持久对象的 ID,以便我可以以某种方式获取它并从控制器发送回视图。作为一个简单的视觉示例,假设我从视图向控制器发送这个值数组(1, 2, 3, 4, 5)由于某些 X 原因,只有 1 ,4 和 5 被持久化(意味着从数据库中完全删除)到数据库,对吗?

还可以说我将在以下位置使用事件侦听器Producto实体。因此,如果没有测试而只是从示例中获取代码,则代码应该是这样的Listener:

use Doctrine\ORM\Event\LifecycleEventArgs;
use Entity\Producto;

class StoreDeletedIds
{
    private $deletedItems = []; 

    public function postDelete(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        if ($entity instanceof Producto) {
            array_push($deletedItems, $entity->getId());
        }
    }
}

我对此的疑问是:

  • 上面的代码好还是不好?
  • Is $deletedItems每次 Doctrine 调用监听器时都会清理?
  • 我该如何返回$deletedItems为了在控制器上捕获它并将其发送回视图?
  • 我需要定义订阅者吗?为什么?

这对我来说是新主题,所以我需要一些建议


下列的@PeterPopelyshko评论这是我提供的解决方案,只需定义一个抽象类Model\DeleteLifeCycleCallbacks.php并将代码放入其中:

use Doctrine\ORM\Mapping as ORM; // not so sure if this is need here

abstract class DeleteLifeCycleCallbacks
{
    private static $preDeletedEntities;// static array that will contain entities due to deletion.
    private static $deletedEntities;// static array that will contain entities that were deleted (well, at least the SQL was thrown).

    /**
     * This callback will be called on the preRemove event
     * @ORM\PreRemove
     */
    public function entityDueToDeletion()
    {
        // This entity is due to be deleted though not deleted yet.
        self::$preDeletedEntities[] = $this->getId();
    }

    /**
     * This callback will be called in the postRemove event
     * @ORM\PostRemove
     */
    public function entityDeleted()
    {
        // The SQL to delete the entity has been issued. Could fail and trigger the rollback in which case the id doesn't get stored in the array.
        self::$deletedEntities[] = $this->getId();
    }

    public static function getDeletedEntities()
    {
        return array_slice(self::$preDeletedEntities, 0, count(self::$deletedEntities));
    }

    public static function getNotDeletedEntities()
    {
        return array_slice(self::$preDeletedEntities, count(self::$deletedEntities)+1, count(self::$preDeletedEntities));
    }

    public static function getFailedToDeleteEntity()
    {
        if(count(self::$preDeletedEntities) == count(self::$deletedEntities)) {
            return NULL; // Everything went ok
        }

        return self::$preDeletedEntities[count(self::$deletedEntities)]; // We return the id of the entity that failed.
    }

    public static function prepareArrays()
    {
        self::$preDeletedEntities = array();
        self::$deletedEntities = array();
    }
}

然后按如下方式使用它:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 */
class Producto extends Model\DeleteLifeCycleCallbacks
{
    // entity methods and properties here
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DRY:如何在 Symfony2 项目的多个实体中使用此代码?特质? 的相关文章

  • PHP set_include_path 的“起点”是什么

    在 PHP 中 set include path 相对于什么 它是 PHP exe 所在的文件夹吗 是网络根吗 换句话说 set include path 或 set include path 指的是哪个文件夹 相对路径是从文件所在位置解析
  • symfony2以管理员用户身份访问私有文件

    在我的 Symfony2 3 项目中 我有一个前端网站和一个后端 后端通过 security yml 文件进行安全保护 只有 role admin 用户可以访问后端 我现在想要的是只有管理员用户可以下载 pdf 文件存储在资产中 有没有办法
  • Jwt 令牌是唯一的

    我正在使用 JWT 网络令牌系统 我能够成功生成令牌 我在 Laravel 中创建 JWT 令牌 如下所示 我正在使用以下技术堆栈 拉拉维尔 5 2 http laravel com 框架 JWT 包裹 https github com t
  • 如何增加 Smarty 变量?

    我通常不是一个聪明人 所以我有点卡住了 我想回显数组的索引 但我想每次回显时都增加它 这就是我所拥有的 ul foreach from gallery key index item image li img src image alt li
  • Aptana Studio 与 Eclipse [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Laravel 表单标签中内联“必需”星号

    我正在尝试为 Laravel 中的必填字段添加红色星号 但我不确定如何将它们添加到标签中 我目前正在做的是 Form label took act or sat Did you or will you take the SAT or ACT
  • 将数据插入多个表 PHP MySQL

    我有一个用于存储食谱的基本数据结构 它由三个表组成 如下所示 表 1 食谱 recipe id recipe name 表 2 成分 成分 ID 成分名称 表 3 配方 成分 配方 id 成分 id 我在添加新配方时遇到问题 想知道插入的最
  • SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 laravel 9

    尝试分配外键 但是当您运行迁移时 我收到此错误 我不明白问题是什么 SQLSTATE HY000 一般错误 1215 无法添加外键约束 SQL alter tablecategories添加约束categories parent key f
  • Faker 生成奇怪的电话号码?

    因此 我使用 Laravel 创建一个数据库并对其进行播种 我遇到了一个问题 它生成一个电话号码 如下所示 635 889 5802 x45134 这会因超出数据库列的所需长度而导致问题 所以我的问题是 从实践层面来看 它为什么这样做 现实
  • 是否有不是完整网站的卡片/目录应用程序?

    我遇到的每个解决方案似乎都是一个完整的商店 有太多的选项和太多的功能 我可以编写自己的购物车来从前端获得我需要的最小功能 我只是想减少编写复杂后端的时间 我真正想要的是提供产品目录 订单管理等后端功能 同时提供流畅一致的 API 来访问完全
  • 在 Drupal 8 中如何在保存节点之前操作值?

    我有一个编辑节点表单 当用户输入新值并单击提交来编辑节点时 我首先想取回旧节点 操作该值 然后保存 更新节点 以下是我的解决方案 但它不起作用 function custom module form node form alter form
  • 使用列模数的更简洁方法

    我目前有一个人员列表 我已将其分为两列 但在完成代码后 我一直想知道是否有更有效或更干净的方法来完成同样的事情 echo table class area list tr Loop users within areas divided up
  • 在 JWT Laravel 中使用授权标头时获取 token_not_provided

    I read 本教程 http blog nedex io create an api server for mobile apps using laravel 5 1 我设法使它完美地工作 唯一的问题是当我从 令牌 token here
  • 如何设置 PHP CodeSniffer 来扩展 WordPress 编码标准 + VSCode 中的自动修复错误?

    如何使用扩展 WordPress 编码标准的个人规则为项目设置 PHP CodeSniffer 保存时在 VSCode 中自动修复错误 I have 全局安装 CodeSniffer https github com squizlabs P
  • MySQL记录保存到数据库的当前时间

    我正在使用 Zend Framework 1 12 和 Mysql 我想在数据库中添加列 该列保存记录插入表中时的当前日期时间 有人知道我如何定义此列吗 此功能必须在 Mysql 站点上运行 而不是在 PHP 站点上运行 您必须将列类型更改
  • 如何使用 file_put_contents() 写入变量值?

    一整天都在试图解决这个问题 假设这只是一个小错误 我正在尝试使用file put content将变量值放入另一个 php 文件中 下面的代码将解释 将数据写入php的文件
  • PHP 变量无法使用 json_encode() 正确返回成功 AJAX/jQuery POST

    我已经尝试了几个小时才能让它发挥作用 我有一个 div 标签和一个hidden input field我想使用 AJAX 进行更新 这div标签如下 div class friends tab list div div
  • 在 Amazon Dynamo DB 中编写复杂查询(数学表达式)

    我已经从 mysql 切换到 Dynamo DB 在 mysql 中 我使用了一个查询来获取靠近特定纬度和经度的所有用户 查询是 SELECT SQRT POW 69 1 latitude latitude 2 POW 69 1 longi
  • 在mysql查询中对多个日期范围求和

    我有一个 MySql 表 产品 包含三列 Date Product Qty 我的目标是每周对每种产品的数量进行求和 获取两个给定日期之间的 SUM 很容易 SELECT SUM qty FROM products WHERE date gt
  • 我在 wamp for PHP 路径中遇到错误

    我的 wamp 服务器图标当前为橙色 这意味着 3 个服务器中只有 2 个正在运行 我无法打开 phpmyadmin 页面 因为它给出 404 未找到错误 如果我右键单击底部的 wamp 图标 则会收到一条错误消息 Error C wamp

随机推荐

  • 使用php动态地将内容插入到pdf文件中

    我有一本 Word 电子书 在分发给客户之前我将其转换为 PDF 我想将他们的电子邮件地址动态插入到电子书中的所有链接中 以允许他们访问我网站上的会员专用内容 并且我想作为图书下载过程的一部分动态执行此操作 我简单地看了一下http us
  • Kivy:弹出窗口只能有一个小部件作为内容

    我在 kv 文件中使用弹出窗口时遇到问题 我知道弹出窗口只能有一个小部件作为其内容 但是如果我只将 GridLayout 作为包含标签和按钮的子项传递 这不应该起作用吗 这是我的Python代码 import kivy LabelB fro
  • Visual Studio 2013 更新 3,设计器无法加载

    我有以下情况 我昨晚安装了 Visual Studio Update 3 现在我有一个问题 当我打开我在更新 2 时完成的项目 通用应用程序 时 我的设计器将无法加载并抛出异常 有谁知道如何解决这个问题 我想这不是一个错误 因为可能一切都经
  • 使用 HTML/CSS 使表格在移动设备上响应

    我有这张表 它是一封较大电子邮件的一部分 当用户的设备是手机或小屏幕时 我希望表格从 2 列 2 行变为 1 列 4 行 希望使用尽可能少的代码 table style width 100 font family none color 33
  • 如何在 PHP 或 MySQL 中查找日期是否符合某个区间?

    假设我有一个日期时间 2011 年 6 月 16 日 7 00 我希望能够在 2011 年 8 月 5 日的 7 00 进行检查 并能够知道它恰好是自第一次日期以来 1 天的倍数 而 7 01 不算在内 因为它不是精确倍数 另一个测试集 假
  • 这个 NLP 问题层次结构描述中的最大池化是什么类型

    我正在尝试实现这个描述以及我所做的 我生成了形状的 uni gram bi gram tri gram 15 512 使用填充 然后对于每个单词 我连接三个特征向量 3 512 然后我向他们申请 Globalmaxpooling1D 我不知
  • 检查每个页面请求的标头

    我需要检查每个页面请求的请求标头 我认为尝试这个的地方应该是在 撇号 express 模块中 我创建了自己的模块 auth 它扩展了 apostrope express module exports extend apostrophe ex
  • Vim - 删除多行中的直到(包括)字符

    我有这个代码 def foo c Char c match case a B 我的光标位于后面的空格上 我想删除所有内容 直到 包括 我怎样才能做到这一点 我可以在光标位于第一行任意位置时执行相同操作吗 块中的任何位置 并将光标放在 d e
  • 动态添加的 Facebook 发送按钮未呈现

    我想在页面加载后动态添加一个 Facebook 发送按钮 iframe 尚不支持 由于网站的构建方式 它将成为通过 AJAX 在用户上加载的 HTML 模板的一部分 行动 虽然我正在导入 FB JavaScript SDK 但当我通过 AJ
  • Protractor/Jasmine 条件测试用例

    与此问题相关 如何使用 Protractor 创建条件测试用例 https stackoverflow com questions 36701985 how can i create conditional test cases using
  • 我可以使用什么方法从 VBA 调用 Web 服务?

    从 Excel 调用 Web 服务的最简单方法是什么 我使用的是 2002 版 请不要使用第三方工具或库 这必须很容易使用一些 VBA 我可以将其粘贴到那里 使用它并随时触摸 我不认为有任何特别简单的方法可以直接从 VBA 与 SOAP 对
  • 如何使用 Web3.js 或 Ethers.js 强制传输 NFT

    我正在尝试构建一个应用程序 其中一部分涉及将 NFT 从我的帐户转移到用户的帐户 以前 我使用 Moralis 来完成此任务 但这段代码抛出了一个错误 Error Contract with a Signer cannot override
  • 如何在 Javascript 中从 Firefox 剪贴板获取内容

    我非常沮丧地在我的 React 应用程序上从剪贴板进行粘贴 I used navigator clipboard readText 在 Chrome 浏览器上完美运行 但它在我最新的 Firefox 浏览器上不起作用 我尝试搜索SO 但与之
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • Gulp - 术语“gulp”未被识别为 cmdlet 的名称

    当我开始一个新项目并创建一个新的 gulpfile 时 开始出现这个随机错误 每当我跑步时我都会得到它 这不仅发生在这个项目上 而且已经开始发生在所有其他项目上 我读到环境变量可能存在问题 所以我更新了这些变量 我最近还运行了 ruby 安
  • 在 javascript 中格式化日期直至毫秒

    我们正在使用来自 Microsoft 的以下 js 库https ajax aspnetcdn com ajax 4 0 1 MicrosoftAjax js https ajax aspnetcdn com ajax 4 0 1 Micr
  • Angular 2 --aot 导致 AnimationEntryMetadata 失败

    我的代码可以正常工作ng build and ng build prod但是 当我将 oat 添加到命令中时 它会失败并出现以下错误 Uncaught Error Module build failed Error C Users drem
  • Google 气泡图自定义工具提示列不呈现

    我正在尝试将自定义工具提示添加到气泡图中 以替换默认的工具提示 我已按照文档网站的说明进行操作 here https developers google com chart interactive docs customizing tool
  • MultipartFile 文件名中的特殊字符转换为?在春季启动

    我想知道为什么 spring boot 将 MultiPartFile 文件名特殊字符转换为 例如 pdf 转换为 pdf 我需要配置 Spring 来禁用此行为吗 我已经检查了我的 jvm 配置中的 file encoding 它已经设置
  • DRY:如何在 Symfony2 项目的多个实体中使用此代码?特质?

    我有一段重复的代码 将在我的 Symfony2 项目中的多个实体中使用 因此应用某种 DRY 就可以了 当然如果可能的话 我正在考虑PHP 特性 http php net manual en language oop5 traits php