我一直在与一个小团队合作开展一个关于小说世界建设的小项目.我被分配了管理实体(岩石/地方/物品)的触发器/链式行为的任务,这些行为可以通过多种方式触发,例如将魔法岩石扔进湖中并且怪物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代码片段
>数据库事务,在提交之前和之后到数据库
>附加X触发器的对象,解决它们
>如果满足对它的所有依赖,则检查由X触发的每个触发器
题:
这样的事情甚至可以用PHP构建或者我应该尝试像python这样的其他脚本语言吗?
解决方法:
A PHP code snippet execute each time a database transaction , before is submitted and after to database
不要重新发明*,这有一个令人难以置信的简单解决方案:在数据库调用之上有一个层.
不是直接查询数据库,而是调用处理数据库插入触发器的函数(可能在对象中).正是在那里,您可以添加您的代码,以您喜欢的方式预先处理和后处理您的触发器.
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.
A PHP code snippet execute each time a object that has X triggers attached to it, resolve them
原理与以前相同.如果你使用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);
Each Trigger that is triggered by X be checked if all dependecies to
it are satisfied
可以通过上面的方法轻松处理更多的PHP逻辑,您将能够分辨出来.例如,您可能希望每次需要处理触发器时调用一个泛型函数,该触发器依次检查依赖性是否满足,如果是,则运行特定触发器.
无论哪种方式都有更好的方法来解决这个问题,而不是使用eval或一些mysql触发器黑客,你可以看到:)