Li3:在 parent class 中查找过滤器在 child 调用 find() 时未触发

Li3: Find filter in parent class not triggering when child calls find()

这是一道关于李三哲学的题。我有一个 child class,试图在 parent class 上 运行 find() 作为其 find() 的过滤器但是当 child 调用 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 模型并尝试在 Members 上执行 find()save(),则不会触发过滤器。

<?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 中的过滤器并继承 + 覆盖 Users 模型中的 find()save() 方法,这会导致调用 [=例如,29=] 触发 Users::find(),但是 Li3 这样做的哲学是什么?

我的观点是,如果过滤器中的代码实际上是您的用户模型的一部分,例如在做与用户业务规则相关的事情时,那么您应该覆盖 find()save().

并且当您为 User class 编写单元测试时,您可以轻松地为这些函数编写测试,而不必依赖那些未被清除的函数的过滤器(可以是在单元测试期间很常见)

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