🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CakePHP

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

Q&A

解決済

1回答

2826閲覧

独自に追加したcakephp3のエラーハンドラーをテストするためにWarning以外のエラーを発生させたい

退会済みユーザー

退会済みユーザー

総合スコア0

CakePHP

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

0グッド

0クリップ

投稿2019/11/21 10:26

前提・実現したいこと

https://book.cakephp.org/3/ja/development/errors.html#id7
公式ドキュメントを元に追加したエラーハンドラーでWarning以外のエラーを検知できるか確認したい

エラーハンドラーの役割

システムで起きた例外・error.logに記載される404以外のエラーが起きた時システム管理者に通知する

以下のようなエラーハンドラーを作りシステムエラーがあった場合メール通知するようにしています

色々と前後してしまい申し訳無いのですが、検知できるエラーの種類はこのエラーレベルのなかで、app.phpファイルでログで受け付けるという設定になっているものという理解でいます。
まず、この理解って正しいでしょうか?
https://book.cakephp.org/3/ja/core-libraries/logging.html

Emergency: システムは使用出来ません

Alert: 今すぐ行動する必要がある
Critical: 致命的な状態
Error: エラー状態
Warning: 警告状態
Notice: 正常であるが、重大な状態
Info: インフォメーションメッセージ
Debug: デバッグレベルメッセージ

該当のソースコード

<?php namespace App\Error; use Cake\Error\BaseErrorHandler; use Cake\Core\Configure; use Cake\Controller\ComponentRegistry; use App\Controller\Component\MailComponent; class AppError extends BaseErrorHandler { public function _displayError($error, $debug) { $level = $error["error"]; $systemError = array( 'level' => $error["error"], 'description' => $error["description"], 'file' => $error["file"], 'line' => $error["line"] ); if($level != 'Warning' && $level != 'Notice' && $level != 'Debug'){ $mail = new MailComponent(new ComponentRegistry()); $mail->sendSystemError($systemError); } } public function _displayException($exception) { $systemException = $exception->getMessage(); $mail = new MailComponent(new ComponentRegistry()); $mail->sendSystemException($systemException); } }

試したこと

このようなコントローラーを作りアクセスすることでエラーを発生させようとしました
外部APIで存在しないアカウントでリクエストした場合、error.logにはErrorと出てくるのでerror.logに出てくる内容をエラーハンドラーで取得できるのではと思っていました

ただ、このようなエラーってエラーハンドラーでは検知できないものなのですね

Warning以外のエラーを意図的に発生させる方法がわからず、実際に検知できるのか検証できずにいます。今回のような場合の検証方法ってどのようにしたらよいでしょうか?

<?php namespace App\Controller\Admin; use App\Controller\AppController; use Cake\Core\Configure; use Cake\Chronos\Chronos; use Cake\I18n\Time; use Cake\Core\Exception\Exception; use Cake\Http\Exception\InternalErrorException; use Cake\Datasource\Exception\RecordNotFoundException; class DebugsController extends AppController { ・・・・ public function send_error(){ \Payjp\Payjp::setApiKey("testtest"); \Payjp\Charge::create(array( "card" => "tok_XXXXXX", "amount" => 3500, "currency" => "jpy" )); } }

・・・

読みにくい文書で申し訳ありません
根本的に満たしたい要件に対しての実装では無いのでは?や、この部分の情報が必要ということがありましたらご指摘いただけますとありがたいです

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

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

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

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

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

guest

回答1

0

ベストアンサー

phpでエラーを発生したいのであれば trigger_error を使用します。

PHP: trigger_error - Manual

php

1trigger_error('NOTICEエラーだよ'); // デフォルトは E_USER_NOTICE レベル 2trigger_error('WARNINGエラーだよ', E_USER_WARNING); 3trigger_error('ERRORエラーだよ', E_USER_ERROR);

補足

メールを送信するのにコンポーネントを利用するのは冗長です。メーラークラスを利用しましょう。

再利用可能なメールの作成 - Email - 3.8

_displayError, _displayException をオーバーライドするより、handleError, handleException をオーバーライドして、メール送信メソッドを読んだほうがスマートだと思います。

エラー時にメールで通知をしたいだけなら、fusic/encount というプラグインを使うのもいいでしょう。

投稿2019/11/21 11:34

nojimage

総合スコア959

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

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

退会済みユーザー

退会済みユーザー

2019/11/22 10:27

ご指摘ありがとうございます 記載いただいたプラグインに関しては初めて知りました 合わせて試して見ます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問