0

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

我保存正常页面寄存器(我访问的网址)的代码是:

$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));
4

2 回答 2

1

正如我的评论和 Rowan 的回答中提到的,这可能是通过扩展您的基本控制器最容易做到的。

在 testdrive 示例应用程序中,您会注意到有一个protected/components/Controller.php. 如果您查看源代码,您会看到它扩展了CController

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

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

哦,在回应您“未访问任何 URL”的评论时,您确实意识到 AJAX 调用仍在访问某种形式的 URL,对吧?即通过url密钥指定的那个?因此,如果您真的想要,您可以将日志记录添加到您的 AJAX 调用的任何 url,但这很快就会变得很麻烦,而且您将违反DRY 原则

于 2013-09-17T15:55:59.560 回答
1

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

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

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

于 2013-09-16T23:07:47.740 回答