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 编写单元测试时,您可以轻松地为这些函数编写测试,而不必依赖那些未被清除的函数的过滤器(可以是在单元测试期间很常见)
过滤器应保留用于横切功能,例如日志记录。
这是一道关于李三哲学的题。我有一个 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 编写单元测试时,您可以轻松地为这些函数编写测试,而不必依赖那些未被清除的函数的过滤器(可以是在单元测试期间很常见)
过滤器应保留用于横切功能,例如日志记录。