Li3:查找父类中的过滤器,当子调用find()

时间:2015-05-03 00:20:34

标签: php lithium

这是关于Li3哲学的问题。我有一个子类,试图在父类上运行find(),作为find()的过滤器,但在孩子调用find()时不会执行。

我的Members模型扩展了Users模式。 Users模型有一些过滤器:

<?php
# Users.php
namespace app\models;

class Users extends \lithium\data\Model {
}

Users::applyFilter('find', function($self, $params, $chain) {
    echo __LINE__;
    return $chain->next($self, $params, $chain);
});

Users::applyFilter('save', function($self, $params, $chain) {
    echo __LINE__;
    return $chain->next($self, $params, $chain);
});
?>

<?php
# Members.php
namespace app\models;

class Members extends \app\models\Users {
}
?>

如果我在任何控制器中使用Members模型并尝试在find()上执行save()Members,则不会触发过滤器。

<?php
# FooController.php
namespace app\controllers;

use app\models\Members;

class FooController extends \lithium\action\Controller {
    public function bar() {
        $bar = Members::find();
        return compact('bar');
    }

    public function baz() {
        $baz = Members::create();
        $baz->save([
            'type' => 'addiction',
            'framework' => 'lithium'
        ]);
        return compact('baz');
    }
}
?>

我总是可以省略Users中的过滤器,并继承+覆盖find()模型中的save()Users方法,这些方法会导致对{{1}的调用例如,触发Members::find(),但这样做的Li3理念是什么?

1 个答案:

答案 0 :(得分:1)

我的观点是,如果过滤器中的代码实际上是用户模型的一部分,就像执行与用户业务规则相关的操作一样,那么您应该覆盖find()和{{ 1}}。

当您为save()类编写单元测试时,您可以轻松地为这些函数编写测试,而不必依赖于那些未被清除的函数的过滤器(这在单元测试期间很常见)< / p>

过滤器应保留用于横切功能,例如日志记录。