xtr*_*nge 5 cakephp cakephp-2.0
我想知道是否有一种方法可以添加created_by和modified_by类似于CakePHP中的方式created和modified工作方式?
我喜欢这样一个事实:蛋糕可以识别这些字段并自动处理它们,无论模型如何,我根本不需要实现它们.我想使用当前用户ID添加一个类似的功能(在我的应用程序中,总是有一个用户ID,即使它有时可能是0).
我假设起始位置before_save()在app_model中?
-
另外,有没有办法让我自己将蛋糕识别为用户表的外键(类似于它识别的方式user_id),还是我必须手动添加has/belongs to relationship?我问,因为这将在我的大多数模型上进行,所以我宁愿减少冗余代码.
谢谢!
对于问题的第一部分,我使用此行为代码来完成您正在寻找的内容:
class UserLinkBehavior extends ModelBehavior
{
/**
* The string to use to retrieve the user id from CakeSession
*
* @var string
*/
var $user_id_key = 'Auth.User.id';
function setup(&$model, $settings)
{
if(isset($settings['user_id_key']))
{
$this->user_id_key = $settings['user_id_key'];
}
}
function beforeSave(&$model)
{
App::uses('CakeSession', 'Model/Datasource');
$logged_user_id = CakeSession::read($this->user_id_key);
if(isset($logged_user_id))
{
$this->set_user_on_current_model($model, $logged_user_id);
}
return true;
}
/**
* Set the created_by and modified_by user id on the current model
*
* @param Model $model
* @param int $logged_user_id
* @return void
*/
private function set_user_on_current_model(&$model, $logged_user_id)
{
if(isset($logged_user_id))
{
/*
* Id is not set -> it is a creation
*/
if($model->hasField('created_by') && (!isset($model->data[$model->alias]['id']) || empty($model->data[$model->alias]['id'])))
{
if(!isset($model->data[$model->alias]['created_by']))
{
$model->data[$model->alias]['created_by'] = $logged_user_id;
/*
* If the save is called with a whitelist, add 'created_by' to the whitelist
* in order to have this field saved as well
*/
if(!empty($model->whitelist) && !in_array('created_by', $model->whitelist))
{
$model->whitelist[] = 'created_by';
}
}
}
/*
* Id is set -> it is an update
*/
if($model->hasField('modified_by') && isset($model->data[$model->alias]['id']) && !empty($model->data[$model->alias]['id']))
{
$model->data[$model->alias]['modified_by'] = $logged_user_id;
/*
* If the save is called with a whitelist, add 'modified_by' to the whitelist
* in order to have this field saved as well
*/
if(!empty($model->whitelist) && !in_array('modified_by', $model->whitelist))
{
$model->whitelist[] = 'modified_by';
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在模型或AppModel中声明它
var $actsAs = array('UserLink');
Run Code Online (Sandbox Code Playgroud)
对于问题的第二部分,您可以添加对行为的beforeFind()回调,并使用model-> bindModel()函数将具有created_by和modified_by字段的模型与User模型链接.Personaly我喜欢在需要时手动在每个模型中声明这些链接.