0

私はデータベースロガー機能を実装するためにcakephpのドキュメントに従っています。でロガークラスを作成した後、すべてが機能するようになりました

app / Lib / Log / Engine / DatabaseLogger.php

これらの行をブートストラップに追加します

CakeLog::config('otherFile', array(
'engine' => 'DatabaseLogger',
'model' => 'LogEntry',
// ...
));

この後、を呼び出すことでデータベースにログインできます

CakeLog::info(message);

すべて正常に動作しますが、ユーザーのユーザー名とIPアドレスを自動的にログに記録しようとすると問題が発生しました。私は多くの解決策をオンラインで検索しましたが、答えを見つけることができないようです。DatabaseLoggerクラスのコントローラーにアクセスすることは可能ですか?

4

2 に答える 2

2

コントローラーにアクセスする必要はありません

必要な情報は事実上グローバルであり、コントローラー オブジェクトにアクセスして取得する必要はありません。

クライアント IP

Router::getRequestメソッドを使用して、現在のリクエスト オブジェクトを取得し、そこからクライアント IP を取得できます。

$request = Router::getRequest();
$ip = $request->clientIp();

または単にenvメソッドを使用します。

$ip = env('REMOTE_ADDR');

現在のユーザー名

これには、静的セッション インターフェイスを使用します。

$name = CakeSession::read('Auth.User.name');
于 2013-01-28T08:46:23.087 に答える
0

これにより、正しい方向に進むことができれば幸いです。現在、CakePHPアプリの一部を2.2に移行中です。私はこれについて100%確信しているわけではありませんが、これを実行する方法についてのようです。私はデータベースロギングの使用を考えています。あなたのアイデアが気に入ったので、これがどのように機能するかを教えてください。そうでない場合は、フィードバックを提供してください。さらに深く掘り下げます。;)

LogEntryモデル(データベーステーブル)を作成して、ユーザー名とIPアドレスのフィールドを含めます。

AppControllerを作成します。beforeFilterメソッドで、ユーザーのIPアドレスをセッションに配置します。CakeRequestオブジェクトにはIPアドレスが含まれます。

$this->request->clientIp();

そのモデルのbeforeSave()メソッドで、ユーザー名とIPアドレスを収集します。

ユーザー名フィールドにアクセスするには(AuthコンポーネントとclientIpをIPアドレスのキーとして使用していると仮定します):

App::import('Component', 'Session');
$Session = new SessionComponent();
$user = $Session->read('Auth.User');
$ip = $Session->read('clientIp');

これらを適切なフィールドに割り当てて、保存されるようにします。

于 2013-01-28T05:32:52.750 に答える