由于我是CakePHP的新手,我遇到了一些我无法弄清楚的问题。
我使用CakePHP 3.4。我尝试编写一个简单的记录器功能。应用于记录的每个更改,我都希望记录到ChangeLog模型。
使用afterSave()事件,我有以下代码:
public function afterSave($event, $entity, $options) {
$logTable = TableRegistry::get('ChangeLogs');
foreach ($entity->getDirty() as $key) {
if($key != 'modified') {
$record = $logTable->newEntity();
$record->previous_value = $entity->getOriginal($key);
$record->new_value = $entity[$key];
$record->table_name = 'Stars';
$record->column_name = $key;
$record->row_id = $entity->id;
$record->user_id = [what should i put here?]
$record->user_id = $_SESSION['Auth']['user']['id'];
$logTable->save($record);
}
}
效果很好,但我也想知道哪个用户执行了操作,我不知道如何在模型中获得当前用户。
我尽量避免在控制器中传递参数,因为我希望自动检测用户,并且作为开发人员,每次我尝试在控制器中更改/添加新功能时,我都不想记住它。
答案 0 :(得分:3)
不要直接在CakePHP中使用superglobals,这肯定会在某些时候咬你,特别是在测试环境中!始终使用抽象方法(如the session object)来访问此类数据!
话虽这么说,您可以使用事件将当前用户注入模型回调/事件流。例如,全局注册到Model.afterSave
,并将当前用户传递给选项。
这是一个证明原理的基本例子。想象一下你的app控制器中有这样的东西:
use Cake\Datasource\EntityInterface;
use Cake\Event\Event;
use Cake\Event\EventManager;
// ...
public function initialize()
{
parent::initialize();
// ...
EventManager::instance()->on(
'Model.afterSave',
['priority' => -1],
function (Event $event, EntityInterface $entity, \ArrayObject $options) {
// retrieve the user id from the auth component
$options['user_id'] = $this->Auth->user('id');
}
);
}
鉴于-1
的优先级(默认优先级为10
),它将在该事件的模型回调之前调用,以便在您的表类中,您可以访问{ {1}}通过user_id
参数。
$options
对于更可重用的东西,您可能使用自定义侦听器类。另请查看$record->user_id = $options['user_id'];
,Auth.afterIdentify
和Model.initialize
等事件,这些事件可能会被注册以注册您的模型事件监听器并检索当前用户。
另见
答案 1 :(得分:0)