PHP – 链接触发器如何创建/存储?
我一直在与一个小团队合作开展一个关于小说世界建设的小项目.我被分配了管理实体(岩石/地方/物品)的触发器/链式行为的任务,这些行为可以通过多种方式触发,例如将魔法岩石扔进湖中并且怪物X将出现,并继续触发事物在链条中直到它到达终点.
我试过这个 $Trigger_123 = new stdClass(); $Trigger_123->name = "Name"; $Trigger_123->renderOn = ? // (object_345->throwedInLakeX) ? 我怎样才能将它存储在MySQL中?我可以检查一下它的链条部分吗?我也试过MySQL触发器,但我找不到在这些触发器上执行PHP的方法.例如,在更新或删除时运行PHP代码. Cron的工作不是一个选择,因为将来会添加很多东西,而cron的工作将花费大量的时间来完成,我希望找到一个更基于PHP的解决方案. 编辑(添加一些额外信息) 我试图以多种方式实现这一点.我最终得到了一个dependecies系统,就像debian软件包一样,我相信它不适合这个. 数据库结构 Table "object" -------------- ID (int) Name (varchar) Table "triggers" ---------------- ID (int) Name (varchar) Data (blob) // usually,I store php code and use eval to run Table "attributes" ------------------ ID (int) attribute (varchar) value (blob) Table "object_has_triggers" --------------------------- ID (int) ObjectID (int) TriggerID (int) Table "object_has_attributes" ----------------------------- ID (int) ObjectID (int) AttributeID (int) 我想要的结果是每次执行PHP代码片段 >数据库事务,在提交之前和之后到数据库 题: 解决方法
不要重新发明轮子,这有一个令人难以置信的简单解决方案:在数据库调用之上有一个层. 不是直接查询数据库,而是调用处理数据库插入触发器的函数(可能在对象中).正是在那里,您可以添加您的代码,以您喜欢的方式预先处理和后处理您的触发器. function processDatabaseInsertion($trigger) { //Preceding code goes here //Database transaction goes here //Post-processing code goes here } $Trigger_123 = new stdClass(); $Trigger_123->name = "Name"; $Trigger_123->renderOn = $object_345->throwedInLakeX; processDatabaseInsertion($Trigger_123); 过度简化,但你明白了.我建议为你的触发器编写一个自定义类,但是我以程序的方式编写它,因为我不知道你是否熟悉OOP.
原理与以前相同.如果你使用PHP> = 5.3,你可以使用闭包来增加它的味道: function processDatabaseInsertion($trigger) { //Preceding code goes here $trigger->renderOn(); //Database transaction goes here //Post-processing code goes here } $Trigger_123 = new stdClass(); $Trigger_123->name = "Name"; $Trigger_123->renderOn = function() use ($Trigger_123) { doAwesomeThing($Trigger_123); } processDatabaseInsertion($Trigger_123); 或者采用更传统的方法: function processDatabaseInsertion($trigger) { //Preceding code goes here switch($trigger->renderOn) { case "awesomeThing": doAwesomeThing($trigger); break; case "anotherThing": break; default: break; } //Database transaction goes here //Post-processing code goes here } $Trigger_123 = new stdClass(); $Trigger_123->name = "Name"; $Trigger_123->renderOn = "awesomeThing"; processDatabaseInsertion($Trigger_123);
可以通过上面的方法轻松处理更多的PHP逻辑,您将能够分辨出来.例如,您可能希望每次需要处理触发器时调用一个泛型函数,该触发器依次检查依赖性是否满足,如果是,则运行特定触发器. 无论哪种方式都有更好的方法来解决这个问题,而不是使用eval或一些mysql触发器黑客,你可以看到:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |