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代码片段

>数据库事务,在提交之前和之后到数据库
>附加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触发器黑客,你可以看到:)

上一篇:mysql更新触发器


下一篇:Silverlight项目笔记5:Oracle归档模式引起的异常&&表格控件绑定按钮