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

Php Yii保存对ajax请求的日志访问,php,ajax,yii,Php,Ajax,Yii,我想在数据库中保存对用户访问的所有链接的日志访问。 问题是我无法保存何时是ajax请求,因为我没有访问链接,例如,当我删除一个寄存器时,它是由ajax调用生成的。 如何全局检测ajax调用何时在我的数据库中进行并保存 我保存普通页面注册表(我访问的url)的代码是: 如果在基本控制器中重写beforeAction(您正在扩展CController?)并将代码放入其中,则它将在每个操作上运行 如果您想区分它是否是ajax请求,那么可以使用 Yii::app()->request->isAjaxRe

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

我保存普通页面注册表(我访问的url)的代码是:


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

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


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

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

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

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


哦,在回应你的评论“没有访问url”时,你意识到AJAX调用仍然在访问某种形式的url,对吗?即通过
url
键指定的一个?因此,如果您真的愿意,您可以将日志添加到AJAX调用的任何url中,但这将很快变得很麻烦,并且您将违反。

您目前在哪里有这些代码?您应该能够将这样的代码放在base Controller.php中@ernie这段代码在我的名为LogAcess的类中,上面的代码在我的函数saveLog()中。我可以在访问一个url的每个操作中调用这个函数saveLog(),不管怎样,当我有ajax调用时,不访问url,然后不为ajax调用保存日志。是的,我正在扩展CController。你是说要我修改框架吗?我认为这不是修改框架的最佳解决方案。AJAX调用不访问浏览器中的URL,只访问请求中的URL。在我保存日志之前,当用户访问URL时。无论如何,正如您所说,我认为我必须违反DRY原则,在请求(AJAX)调用的每个操作中手动添加日志的保存代码。如果您扩展CController并定义beforeAction(),并且在beforeAction()中,您可以添加逻辑,判断它是否是AJAX请求,如@Rowan所述。
$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));