2013-09-16 51 views
0

我想通過用戶訪問的所有鏈接保存數據庫中的日誌訪問權限。 問題是我不能保存何時是ajax請求,因爲我沒有訪問鏈接,例如當我刪除一個寄存器時,它是由ajax調用。 如何全局檢測ajax調用的時間並保存在我的數據庫中?Yii將日誌訪問保存到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)); 
+0

你現在有哪些代碼?你應該能夠把這樣的代碼放在你的基本Controller.php中。 。 。 – ernie

+0

@ernie這段代碼在我的類中名爲LogAcess,上面的代碼在我的函數saveLog()內。 我可以在每個訪問一個url的動作中調用這個函數saveLog(),無論如何,當我有一個Ajax調用,沒有網址被訪問,然後不保存日誌的Ajax調用。 – Renan

回答

1

如果覆蓋在你的基地控制器控制器的beforeAction(?要擴展CController),並把你的代碼在裏面,它會在每個操作上運行

如果你要區分它是否是一個Ajax請求,您可以使用 Yii::app()->request->isAjaxRequest

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

+0

是的,我正在擴展CController。你是在跟我說修改框架嗎?我認爲這不是修改框架的最佳解決方案。 – Renan

1

正如我的評論和Rowan的回答中提到的,這可能最容易通過擴展基本控制器來完成。

在testdrive示例應用程序中,您會注意到有protected/components/Controller.php。如果你看看源代碼,你會發現它延伸到CController

您還會注意到protected/controllers的控制器擴展了Controller,這意味着它們將包含Controller擁有的所有內容,根據定義,它具有CController的所有功能。

所以,建議是遵循這個習慣用法,然後在protected/components/Controller.php覆蓋beforeAction(),默認情況下除了返回true之外什麼也不做。因此,在protected/components/Controller.php中,只需重新定義beforeAction()以包含日誌語句和任何必需的邏輯即可。

噢,爲了迴應你的評論「沒有網址被訪問」,你確實意識到一個AJAX調用仍然訪問某種形式的URL嗎?即通過url鍵指定的那個?所以,如果你真的想要,你可以將日誌記錄添加到你的AJAX調用的任何url,但這很快就會變得繁瑣,並且你將違反DRY principle

+0

AJAX調用不在瀏覽器中訪問URL,只是在請求中。在用戶訪問URL時保存日誌之前。無論如何,正如你所說,我認爲我必須違反DRY原則,並在請求(AJAX)調用的每個操作中手動添加日誌的保存代碼。 – Renan

+0

如果您擴展CController並定義beforeAction(),並且在beforeAction中,您可以添加邏輯以確定它是否是AJAX請求,而不會像@Rowan提到的那樣違反DRY。 。 。 – ernie