質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

319閲覧

CakePHP4のログ出力にログインユーザ情報を含めたい

yukie1101

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2024/02/09 01:50

実現したいこと

現在、CakePHP4にてログ出力処理をカスタマイズしています。
解析のための情報として、ログインユーザのIDを出力させたいです。

発生している問題・分からないこと

BaseLogクラスをextendsしたDatabaseLogクラスを作成し、
この中でLogsテーブルに情報を出力させていますが、
ログインユーザ情報を取得する方法がわかりません。

該当のソースコード

php

1 public function log($level, $message, array $context = []) 2 { 3 $sessionId = ''; 4 if (session_id() != '') { $sessionId = session_id(); } 5 try { 6 $entity = $this->_table->newEntity([ 7 'datetime' => date('Y-m-d H:i:s'), 8 'level' => $level, 9 'sessionid' => $sessionId, 10 'user_id' => '', // ←ここにログインユーザIDを入れたい 11 'url' => env('REQUEST_URI'), 12 'message' => $this->interpolate($message, $context), 13 ]); 14 $this->_table->saveOrFail($entity); 15 } catch (\Exception $e) { 16 debug($e->getMessage());exit; 17 } 18 } 19

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

CakePHP2での情報として、AuthComponent::user()を利用するという手段を見つけましたが、
CakePHP4では非推奨となっていました。
また、$this->requestが使用できない、というのも確認済みです。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決しましたのでご報告です!

Cakephpのセッションが使えない…ということで、PHPのセッションを無理やり使用しました。
ログイン時に、
$_SESSION['user_id'] = $user->id;
としてログイン情報を格納し、ログ出力時に
$userId = $_SESSION['user_id'] ?? '';
としてユーザIDを取得しています。

なんかもっと良い手があるような気はしていますが…ひとまず、こちらでOKということにしました。
ありがとうございました!

投稿2024/02/14 04:13

yukie1101

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ログインユーザーのIDを取得するためには、CakePHPのセッションコンポーネントを使用してログイン情報にアクセスする必要があります。
検証していませんが、グイン情報をセッションに保存する方法と、ログ出力時にその情報を取得する方法の例です。
まず、ログイン時にユーザーIDをセッションに保存する方法です

// ログイン処理 public function login() { // ユーザー認証処理などがあるとします $userId = 123; // 仮のユーザーID $this->request->getSession()->write('Auth.User.id', $userId); // ログイン後のリダイレクト処理など... }

次に、ログ出力時にセッションからユーザーIDを取得する方法です。

public function log($level, $message, array $context = []) { $sessionId = ''; if (session_id() != '') { $sessionId = session_id(); } $userId = $this->request->getSession()->read('Auth.User.id'); try { $entity = $this->_table->newEntity([ 'datetime' => date('Y-m-d H:i:s'), 'level' => $level, 'sessionid' => $sessionId, 'user_id' => $userId, 'url' => env('REQUEST_URI'), 'message' => $this->interpolate($message, $context), ]); $this->_table->saveOrFail($entity); } catch (\Exception $e) { debug($e->getMessage());exit; } }

これで、ログ出力時にユーザーIDを取得してデータベースに保存することができるはずです。

しかし、ログ出力がログインセッションよりも前に発生する可能性がある場合は、セッションからユーザーIDを取得できないので注意してください

投稿2024/02/09 04:06

shoshinsha123

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukie1101

2024/02/14 03:55

ご回答ありがとうございます! 試してみたのですが、実際にログを出力するDatabaseLog.phpの中では「$this-request」が使用できませんでした。 $this->requestが使えていれば、$this->request->getAttribute('identity')->idなど使用できるのですが… $this->requestを使用せず、セッションを呼び出す方法はあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問