这是有关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
在任何控制器中使用该模型并尝试执行afind()
或save()
on 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
这会导致调用Members::find()
触发Users::find()
,但是以这种方式执行操作的Li3哲学是什么?
我的观点是,如果过滤器中的代码实际上是用户模型的一部分,例如执行与用户业务规则相关的操作,则应覆盖find()
和save()
。
而且,当您为User
该类编写单元测试时,可以轻松地为这些功能编写测试,而不必依赖未清除的过滤器(这在单元测试中很常见)
应当保留过滤器以用于横切功能,例如测井。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句