Php Li3:当子类调用Find()时,父类中的Find筛选器未触发
这是一个关于Li3哲学的问题。我有一个子类,试图在父类上运行Php Li3:当子类调用Find()时,父类中的Find筛选器未触发,php,lithium,Php,Lithium,这是一个关于Li3哲学的问题。我有一个子类,试图在父类上运行find(),该父类作为其find()上的筛选器,但当子类调用find()时,不会执行该子类 我有一个成员模型,扩展了用户模式。 用户模型有一些过滤器: <?php # Users.php namespace app\models; class Users extends \lithium\data\Model { } Users::applyFilter('find', function($self, $params, $c
find()
,该父类作为其find()
上的筛选器,但当子类调用find()
时,不会执行该子类
我有一个成员
模型,扩展了用户
模式。
用户
模型有一些过滤器:
<?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 {
}
?>
我总是可以省略
Users
中的过滤器,并继承并覆盖Users
模型中的find()
和save()
方法,这将导致调用Members::find()
触发Users::find()
,例如,但是Li3这样做的理念是什么呢?我的观点是,如果过滤器中的代码实际上是用户模型的一部分,就像在做一些与用户业务规则相关的事情时一样,那么您应该覆盖find()
和save()
当您为用户
类编写单元测试时,您可以轻松地为这些函数编写测试,而不必依赖那些未被清除的函数上的过滤器(这在单元测试期间很常见)
过滤器应保留用于横切功能,如日志记录 当你这样说的时候,这是有道理的:)谢谢你花时间回复。我想我会将密码散列、设置创建/更新的时间字段等移到重写的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');
}
}
?>