Это вопрос к философии 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
модель, которая вызовет вызов Members::find()
для запуска Users::find()
Например, но какова философия Li3 при поступлении таким образом?
Я считаю, что если код в фильтрах на самом деле является частью вашей пользовательской модели, как, например, при выполнении действий, связанных с бизнес-правилом пользователя, вы должны переопределить find()
а также save()
,
И когда вы пишете модульный тест для User
класс, вы можете легко написать тест для этих функций, не полагаясь на фильтры для тех функций, которые не очищаются (что может быть распространено во время модульного тестирования)
Фильтры должны быть зарезервированы для сквозных функций, таких как регистрация.
Других решений пока нет …