環境など
- CakePHP3.6
- Docker or AWS
- php7.2
質問したい事象
何かしらエラーが発生した際に、だいたい以下のエラーメッセージが表示されます。
Error: [Error] Call to a member function user() on boolean
しかし、エラー該当箇所は別の場所にあります。
(つまり、エラーメッセージが役に立たない)
質問詳細
CakePHP3.6(PHP7.2)を利用しています。
CakePHPで何かしらエラーが発生した際、以下のエラーメッセージがよく表示されます。
Error: [Error] Call to a member function user() on boolean
Stack Trace:
#0 /var/www/html/src/Controller/ErrorController.php(55): App\Controller\AppController->beforeRender(Object(Cake\Event\Event))
#1 /var/www/html/vendor/cakephp/cakephp/src/Event/EventManager.php(353): App\Controller\ErrorController->beforeRender(Object(Cake\Event\Event))
#2 /var/www/html/vendor/cakephp/cakephp/src/Event/EventManager.php(330): Cake\Event\EventManager->_callListener(Array, Object(Cake\Event\Event))
#3 /var/www/html/vendor/cakephp/cakephp/src/Event/EventDispatcherTrait.php(114): Cake\Event\EventManager->dispatch(Object(Cake\Event\Event))
#4 /var/www/html/vendor/cakephp/cakephp/src/Controller/Controller.php(777): Cake\Controller\Controller->dispatchEvent('Controller.befo...')
#5 /var/www/html/vendor/cakephp/cakephp/src/Error/ExceptionRenderer.php(329): Cake\Controller\Controller->render('error500')
#6 /var/www/html/vendor/cakephp/cakephp/src/Error/ExceptionRenderer.php(205): Cake\Error\ExceptionRenderer->_outputMessage('error500')
#7 /var/www/html/vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php(118): Cake\Error\ExceptionRenderer->render()
#8 /var/www/html/vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php(100): Cake\Error\Middleware\ErrorHandlerMiddleware->handleException(Object(Error), Object(Cake\Http\ServerRequest), Object(Cake\Http\Response))
#9 /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Error\Middleware\ErrorHandlerMiddleware->__invoke(Object(Cake\Http\ServerRequest), Object(Cake\Http\Response), Object(Cake\Http\Runner))
#10 /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php(51): Cake\Http\Runner->__invoke(Object(Cake\Http\ServerRequest), Object(Cake\Http\Response))
#11 /var/www/html/vendor/cakephp/cakephp/src/Http/Server.php(98): Cake\Http\Runner->run(Object(Cake\Http\MiddlewareQueue), Object(Cake\Http\ServerRequest), Object(Cake\Http\Response))
#12 /var/www/html/webroot/index.php(40): Cake\Http\Server->run()
#13 {main}
しかしながら、エラーの内容はもっと別のところにあります。
例えばyum install
を実行するのを忘れていた等。。。
CakePHPは、AppControllerにAuth処理を入れたらエラーメッセージが固定されてしまうのでしょうか?
それとも私のやり方が間違っているのでしょうか。
後者の場合、修正方法をご教示いただきたいです……
また、beforeFilter
とbeforeRender
を公開可能な部分で以下に提示させていただきます。
public function beforeFilter(Event $event)
{
// コントローラー名を取得
$controllerName = $this->getRequest()->getParam('controller');
// そのコントローラー内でアクセス許可するアクションリストを取得
$allowAccessMethod = $this->_getAllowAccessMethod($controllerName);
if ($allowAccessMethod) {
// アクセス許可アクションリストを、登録
$this->Auth->allow($allowAccessMethod);
}
return parent::beforeFilter($event);
}
※_getAllowAccessMethod
メソッドは別途定義してあり、配列が返ります。
public function beforeRender(Event $event)
{
// ユーザのログイン情報を取得
$user = $this->Auth->user();
// ビューに渡す
$this->set('user', $user);
}
申し訳ありませんが、よろしくお願いいたします。
追記
Authの認証について追記させていただきます。
今回、ユーザのログインなどには、CakePHPのAuthコンポーネントのIdentify
は使っていません。
理由として、認証を外部のSaaSに委託しているため、APIを叩いてユーザの有無、ユーザ情報の正誤をSaaS側で判断し、
SuccessかFailを返してもらっているからです。
こちらではユーザの情報をほぼ持っていないので、
ログインが成功した際は、$this->Auth->setUser($user);
というふうに、手動でデータをセッションに追加しています。
こちらも関係あるのでしょうか?
追記2
本文の「beforeRender」の処理の中の、
// ユーザのログイン情報を取得
$user = $this->Auth->user();
部分でAuthを使わない($user = '';
)状態にすると、正常にエラーメッセージが表示されるようになりました
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
エラーメッセージを見るとエラー出力時のエラーのように見えます。
#0 /var/www/html/src/Controller/ErrorController.php(55): App\Controller\AppController->beforeRender(Object(Cake\Event\Event))
以下の2のエラーで表示が上書きされているように見えます。
- なんらかのエラー
ErrorController
によってエラー処理(ここで再度エラー)
ErrorController
の処理やエラー時にAuthの設定がどうなるかを見てみると良いと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
エラーメッセージが固定されるわけではなく、Auth 処理に問題があるからエラーが出ているのです。
※Auth 処理はどの画面でも、画面の処理に先立ち呼び出されますから、そこでエラーが出れば「常に同じ場所でエラーが起きている」ことになります
この例でいうと、おそらく $this->Auth が正しくないので、$this->Auth->user() が呼び出せなくなっています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2018/10/10 10:59
重箱の隅をつつくようで申し訳ないですが、質問者さんはCakePHPに関する質問を幾つかされてきていますが、それでも「はじめて」なんですか?
nnahito
2018/10/10 11:06
はい、3月に初めて触り始め、初めてだからわからない部分を幾度と質問させていただいております。実際、業務・自身でCakePHPを触るのは初めてですし、これが私のはじめてのサービスです。ところで、このご質問はご回答していただくにあたり、必要なことでしょうか。申し訳ないのですが、私はどのように質問を修正すればよいかがわからず…察しが悪く申し訳ありません。
m.ts10806
2018/10/10 11:39
ですので、あくまで「重箱の隅をつつくような指摘」です。これだけではこの質問と過去質問の関連性が分からないので。「あれ?前もCakePHPの質問してたのになんではじめて?」と疑問に思っただけです。それに問題の要件としては、はじめてかどうか関係はないと思います。環境情報の中にあるのが違和感ですね。
asahina1979
2018/10/10 11:54
loadComponent('Auth') を AppController じゃ無いところ(認証位置)でよんでそうだなw
nnahito
2018/10/10 11:55
おお!なるほど、ありがとうございます!確かに関連性はありませんでしたね。失礼いたしました。そこ、省いておきます!ご指摘ありがとうございます
2018/10/10 11:57
複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。
m.ts10806
2018/10/10 11:58
細かいところ何度もお騒がせしました
nnahito
2018/10/10 11:59
> loadComponent('Auth') を AppController じゃ無いところ(認証位置)でよんでそうだなw -> 今IntelliJの全文検索してみましたが、呼んでるのはAppContolloerだけでしたね……管理画面用のAppControllerも用意してあるので、その2つで呼んでますが、これはだめ…?
asahina1979
2018/10/10 12:06
事象が発生しているコントローラーでイニシャライズ関数を上書きして親クラスのをよんでないとか
nnahito
2018/10/10 12:12
「parent::initialize();」は呼んでます。この呼び出す位置は、initializeメソッドの最下部で大丈夫でしょうか?それともloadComponentとかする前に呼び出すべきでしょうか?
asahina1979
2018/10/10 12:23
基本は先頭で呼ぶ(上書き・無効化・設定変更等するため)でも呼ぶ位置では変わらない
nnahito
2018/10/10 12:25
なるほど、ありがとうございます。本文に1点追記しました。(「追記2」です)
asahina1979
2018/10/10 12:25
echo get_class($this->Auth); (だったかな)でクラス名はなにになっているか
nnahito
2018/10/10 12:29
「Cake\Controller\Component\AuthComponent 」でした!
asahina1979
2018/10/10 12:30
追記2の直前で?
nnahito
2018/10/10 13:20
はい、そうですね! echo get_class($this->Auth); (改行) // ユーザのログイン情報を取得 (改行) $user = $this->Auth->user(); です!