这是关于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理念是什么?
答案 0 :(得分:1)
我的观点是,如果过滤器中的代码实际上是用户模型的一部分,就像执行与用户业务规则相关的操作一样,那么您应该覆盖find()
和{{ 1}}。
当您为save()
类编写单元测试时,您可以轻松地为这些函数编写测试,而不必依赖于那些未被清除的函数的过滤器(这在单元测试期间很常见)< / p>
过滤器应保留用于横切功能,例如日志记录。