Yii 保存对 ajax 请求的日志访问


Yii save log access to ajax requests

我想在我的数据库中保存一个日志访问权限,其中包含用户访问的所有链接。问题是我无法保存 ajax 请求的时间,因为我不访问链接,例如,当我删除寄存器时,它是由 ajax 调用进行的。如何全局检测 ajax 调用何时保存在我的数据库中?

保存普通页面寄存器(我访问的 url)的代码是:

$ip = CHttpRequest::getUserHostAddress(); // get ip
$id_user = Yii::app()->user->getId();   //get user
$url = Yii::app()->request->requestUri; //get url       

$sql = "INSERT INTO log(id_user, date, hour, url, ip) VALUES (:id_user, 'now', 'now', :url, :ip)";
$rawData = Yii::app()->db->createCommand($sql)->queryAll(true, array(':id_user'=>$id_user,':url'=>$url,':ip'=>$ip));

如果你在基本控制器中覆盖 beforeAction(你正在扩展 CController?)并将你的代码放入其中,它将在每个操作上运行

如果要区分它是否是 ajax 请求,可以使用 Yii::app()->request->isAjaxRequest

http://www.yiiframework.com/doc/api/1.1/CHttpRequest#isAjaxRequest-detail

正如我的评论和 Rowan 的回答中提到的,通过扩展基本控制器可能是最简单的方法。

在体验版示例应用中,你会注意到有一个protected/components/Controller.php。 如果你看一下源代码,你会发现它扩展了CController。

您还会注意到,控制器protected/controllers扩展控制器,这意味着它们将包含控制器拥有的所有内容,根据定义,控制器具有 CController 拥有的所有内容。

因此,建议遵循这个成语,然后在 protected/components/Controller.php 中,覆盖 beforeAction(),默认情况下,除了返回 true 之外什么都不做。 所以在 protected/components/Controller.php 中,只需重新定义 beforeAction() 以包含您的日志记录语句和任何必要的逻辑。

哦,为了回应您的评论"没有访问 URL",您确实意识到 AJAX 调用仍在访问某种形式的 URL,对吗? 即通过url键指定的那个? 因此,如果您真的想要,您可以将日志记录添加到 AJAX 正在调用的任何 url,但这很快就会变得麻烦,并且您将违反 DRY 原则。