20200703のlaravelに関する記事は5件です。

【Laravel】エラーページ のカスタマイズ

内容

laravelでは、エラーが発生したときに表示させるページがあらかじめ用意されています
例えば、404 Not Foundや500 Server Errorなどです
しかし、そのページをそのまま利用することは一般的にありません
そこでエラーページのカスタマイズを説明したいと思います
内容は少ないですが、備忘録として記録しておきます

方法

resources/views/errors/以下にビューを配置すればOKです
ただし、ファイル名はエラーコードと同じにしなければなりません
例えば、404.blade.phpや500.blade.phpのようにです

手作業でファイルを作っていってもいいですが、あらかじめ用意されているエラーページがわからなかったり、ページもれがあるといけないので、以下のコマンドを実行することをおすすめします

php artisan vendor:publish --tag=laravel-errors

これによって、resources/views/errors/以下に用意されているビューが生成されます(厳密にはコピーされます)

HTTP例外を発生させるのにabortヘルパーが便利です
引数にエラーコードを指定するだけでエラーを故意的に発生させることができます
第二引数にメッセージを指定して、$exception->getMessage()で呼び出すことができます

abort(404, 'Not Found');

おわり

Laravelでは例外処理があらかじめ組み込ませているので、エラー周辺はページのカスタマイズだけで、簡単なアプリは作れます

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】No connections available in the pool...の原因と対処法

はじめに

Laravelにて開発中、以下のようなエラーが発生したため、その原因と対処法を簡単に記します。

laravel.log
No connections available in the pool {"exception":"[object] (Predis\\ClientException(code: 0): No connections available in the pool at /var/www/application/vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php:337)...

エラーメッセージより

Redisの接続に異常がある

と見当がつく。

原因

Redisへの接続情報に誤りがあった。
具体的には、Redisのホスト名が誤っていた。
根本原因は、AWS Systems Managerのパラメータストアで管理していた、Redisのホスト名に関する変数の値が古いままとなっていた。

対処法

  1. Laravelの.envを確認。
  2. Redis接続情報とAWSのElastiCacheにて使用しているRedis情報を照合。
  3. ホスト名に誤り発見。「REDIS_HOST=」の部分。
  4. Laravelの.env修正。
  5. しかし直らず。
  6. Laravelの.envの作成元であるphp-fpmを確認。
  7. 該当部分の設定も変更。同じく「REDIS_HOST=」の部分。
  8. php-fpm再起動。sudo service php-fpm restart
  9. 直った。

蛇足

php-fpm管理の環境変数初期設定にはAWS Systems Managerを利用していた。
当エラー発生前にEC2インスタンスの再起動が発生しており、AWS Systems ManagerのRedisホスト名が古いままであり実際の値と異なっていたため、Redisへの接続に不具合が生じることとなった。
よって根本解決として、AWS Systems ManagerのRedisホストの変数名を新しいものへと変更した。

終わりです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel × Redis】No connections available in the pool...の原因と対処法

はじめに

Laravelにて開発中、以下のようなエラーが発生したため、その原因と対処法を簡単に記します。

laravel.log
No connections available in the pool {"exception":"[object] (Predis\\ClientException(code: 0): No connections available in the pool at /var/www/application/vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php:337)...

エラーメッセージより

Redisの接続に異常がある

と見当がつく。

原因

Redisへの接続情報に誤りがあった。
具体的には、Redisのホスト名が誤っていた。
根本原因は、AWS Systems Managerのパラメータストアで管理していた、Redisのホスト名に関する変数の値が古いままとなっていた。

対処法

  1. Laravelの.envを確認。
  2. Redis接続情報とAWSのElastiCacheにて使用しているRedis情報を照合。
  3. ホスト名に誤り発見。「REDIS_HOST=」の部分。
  4. Laravelの.env修正。
  5. しかし直らず。
  6. Laravelの.envの作成元であるphp-fpmを確認。
  7. 該当部分の設定も変更。同じく「REDIS_HOST=」の部分。
  8. php-fpm再起動。sudo service php-fpm restart
  9. 直った。

蛇足

php-fpm管理の環境変数初期設定にはAWS Systems Managerを利用していた。
当エラー発生前にEC2インスタンスの再起動が発生しており、AWS Systems ManagerのRedisホスト名が古いままであり実際の値と異なっていたため、Redisへの接続に不具合が生じることとなった。
よって根本解決として、AWS Systems ManagerのRedisホストの変数名を新しいものへと変更した。

終わりです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GuzzleでのAPI通信先でのデータ取得方法を知りたい

結論

POSTで送るなら$_POSTでいいじゃない!!!!!

$postData = $_POST['hoge'];

これで取れます。

念の為

        if(isset($_POST['hoge'])){
            $hoge = $_POST['hoge'];
        } else {
            // Error return
            return 何らかのエラーコードなりをレスポンスすればよいでしょう
        }

とすればきっと良いはず。

半日の時間は何だったのかという己の愚かさと
$_POSTとか数年ぶりに書いたので今もこの書き方で良いのだろうか
という疑問も新たに生まれた

伸びしろと思いたい。

ここからは元文

$requestでデータが取れない

$request->all();

できっとPOSTからのデータは取得出来るはず、、、
そんな簡単に考えていたら、半日ハマってしまっている。

環境

PHP7系(APIも)
docker

そもそもAPIは呼び出し側しか触ったことがなかった!

今までサービス内、サービス外、様々なAPIを触って、なんとなくAPIは
リクエストに対してレスポンスをくれるものという考えしかなかったが、
今回受け渡し側を触ることになって、
ど、ど、どどおおやってリクエストデータを取得しているの?

ググっても受け渡し側(リクエスト側)はたくさん出てくるのに対して
レスポンス送る側のAPIってどうなってるの?
・・・わからない

色々試した

デバッグ
$d = $request->all();
dd($d);
結果
array(3) {
  ["hoge"]=>
  string(1) "A"
  ["hogeB"]=>
  string(2) "BB"
  ["hoge_code"]=>
  array(1) {
    [0]=>
    string(12) "hoge-code"
  }
}
<script> Sfdump = window.Sfdump || (function (doc) { var refStyle = doc.createElement('style'), rxEsc = /([.*+?^${}()|\[\]\/\\])/g, idRx = /\bsf-dump-\d+-ref[01 ▶
</pre><script>Sfdump("sf-dump-132360725")</script>

なんか配列にちゃんと入ってるけど!けど取れない・・・

これからまた検索の渦にハマるのだろうか

半日アレヤコレヤ考えても全く進めない。。。
このような場合、レスポンス返す側はどうやってデータを取得するのでしょうか

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Log dailyログとerrorログを別々に出力する

目的

  • エラーログだけ別ファイルに出力して欲しい時の方法を下記に記載する。

実施環境

  • MacのローカルにLaravelの環境を構築して実施する。環境構築手順の記事はリンクを後述する。
  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提条件

前提情報

  • 本記事ではログの出力までの方法を最短で記載する、ログの機能の詳細の説明は実施しない。
  • 本記事ではあえてエラーを発生させるべく.envファイルにDBの設定などを記載しない。

読後感

  • dailyログをアプリ名ディレクトリ/storage/logs/直下のdaily-YYYY-MM-DD.logファイルに「[YYYY-MM-DD HH:MM:SS] local.DEBUG: test」と言う文字列で出力し、errorログをアプリ名ディレクトリ/storage/logs/直下のerror.logに「[YYYY-MM-DD HH:MM:SS] local.ERRORLOG: error test」と言う文字列で出力することができる。

概要

  1. アプリ作成
  2. ルーティングの記載
  3. UserHomeController作成と記載
  4. dailyログ出力確認
  5. errorログ出力確認
  6. ログの設定変更
  7. 確認

詳細

  1. アプリ作成

    1. アプリを作成する任意のディレクトリに移動して下記コマンドを実行して「test」と言う名前のアプリを作成する。(オプション--authを付与してユーザ認証機能付きアプリを作成する。)

      $ laravel new test --auth
      
  2. ルーティングの記載

    1. testディレクトリで下記コマンドを実行してルーティングファイルを開く。

      $ routes/web.php
      
    2. 開いたルーティングファイルに下記の一行を記載する。

      routes/web.php
      Route::get('/user_home', 'UserHomeController@index');
      
    3. 記載後のルーティングファイルの内容を下記に記載する。

      routes/web.php
      <?php
      
      use Illuminate\Support\Facades\Route;
      
      /*
      |--------------------------------------------------------------------------
      | Web Routes
      |--------------------------------------------------------------------------
      |
      | Here is where you can register web routes for your application. These
      | routes are loaded by the RouteServiceProvider within a group which
      | contains the "web" middleware group. Now create something great!
      |
      */
      
      Route::get('/', function () {
          return view('welcome');
      });
      
      Auth::routes();
      
      Route::get('/home', 'HomeController@index')->name('home');
      
      //下記を追記
      Route::get('/user_home', 'UserHomeController@index');
      
    4. 保存して閉じる。

  3. UserHomeController作成と記載

    1. testディレクトリで下記コマンドを実行してUserHomeController.phpを作成する。

      $ php artisan make:controller UserHomeController
      
    2. 下記コマンドを実行して先のコマンドで作成したUserHomeController.phpを開く。

      $ vi app/Http/Controllers/UserHomeController.php
      
    3. 開いたUserHomeController.phpを下記の様に修正する。

      test/app/Http/Controllers/UserHomeController.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      //下記を追記する、下記の宣言がないとエラーになる
      use Illuminate\Support\Facades\Log;
      
      class UserHomeController extends Controller
      {
          //下記を追記する
          public function index()
          {
              //Log::debug('ログとして出力したい文字列')の様に記載する
              Log::debug('test');
              return redirect('/');
          }
          //上記までを追記する。
      }
      
    4. 保存して閉じる。

  4. dailyログ出力確認

    1. testディレクトリで下記コマンドを実行してまだlogファイルが存在していないことを確認する。「No such file or directory」が出力されればsingle.logファイルとdaily.logは存在しない。

      $ ls storage/logs/laravel.log
      >ls: storage/logs/laravel.log: No such file or directory
      
    2. testディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    3. ブラウザからtestアプリにアクセスする。デフォルトだとhttp://127.0.0.1:8000/にアクセスするとブラウザでtestアプリが表示できる。

    4. 下記画面が表示されていることを確認する。

      Laravel.png

    5. http://127.0.0.1:8000/user_homeにアクセスしてみる。(アクセスしても何も起こらず、先の画像と同じLaravelのトップページが表示されると思うがその動作は期待する動作である。)

    6. testディレクトリで下記コマンドを実行してログファイルを開く。

      $ less storage/logs/laravel.log
      
    7. 下記の一行が記載されていることを確認する。(YYYY-MM-DD HH:MM:SSはみなさんがhttp://127.0.0.1:8000/user_homeにアクセスした時間が入る。)

      test/storage/logs/laravel.log
      [YYYY-MM-DD HH:MM:SS] local.DEBUG: test 
      
  5. errorログ出力確認

    1. 下記画面右上の「LOGIN」をクリックしログイン画面に進む。

      Laravel.png

    2. なんでも良いのでE-Mail AddressとPasswordを入力して「Login」をクリックする。

      Laravel.png

    3. 下記の様なエラーが出る(このエラー画面は期待する画面である。)

      ?_SQLSTATE_HY000___1045__Access_denied_for_user__root___localhost___using_password__NO___SQL__select___from_`users`_where_`email`___shunokawa_gmail_com_limit_1_.png

    4. testディレクトリで下記コマンドを実行してログファイルを開く。

      $ less storage/logs/laravel.log
      
    5. 下記の様な出力が記載されていることを確認する。

      [2020-07-01 03:14:59] local.ERROR: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from `users` where `email` = shunokawa@gmail.com limit 1) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 1045): SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from `users` where `email` = shunokawa@gmail.com limit 1) at /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Connection.php:671)
      [stacktrace]
      #0 /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Connection.php(631): Illuminate\\Database\\Connection->runQueryCallback('select * from `...', Array, Object(Closure))
      #1 /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Connection.php(339): Illuminate\\Database\\Connection->run('select * from `...', Array, Object(Closure))
      #2 /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2203): Illuminate\\Database\\Connection->select('select * from `...', Array, true)
              ・
              ・
              ・
      
  6. ログの設定変更

    1. testディレクトリで下記コマンドを実行してログの設定ファイルを開く。

      $ vi config/logging.php
      
    2. 開いた設定ファイルを下記の様に修正する。

      test/config/logging.php
      <?php
      
      use Monolog\Handler\NullHandler;
      use Monolog\Handler\StreamHandler;
      use Monolog\Handler\SyslogUdpHandler;
      
      return [
      
          /*
          |--------------------------------------------------------------------------
          | Default Log Channel
          |--------------------------------------------------------------------------
          |
          | This option defines the default log channel that gets used when writing
          | messages to the logs. The name specified in this option should match
          | one of the channels defined in the "channels" configuration array.
          |
          */
      
          'default' => env('LOG_CHANNEL', 'stack'),
      
          /*
          |--------------------------------------------------------------------------
          | Log Channels
          |--------------------------------------------------------------------------
          |
          | Here you may configure the log channels for your application. Out of
          | the box, Laravel uses the Monolog PHP logging library. This gives
          | you a variety of powerful log handlers / formatters to utilize.
          |
          | Available Drivers: "single", "daily", "slack", "syslog",
          |                    "errorlog", "monolog",
          |                    "custom", "stack"
          |
          */
      
          'channels' => [
              'stack' => [
                  'driver' => 'stack',
                  //下記修正・追記する
                  'channels' => [
                      'daily',
                      'errors',
                  ],
                  'ignore_exceptions' => false,
              ],
      
              'single' => [
                  'driver' => 'single',
                  'path' => storage_path('logs/laravel.log'),
                  'level' => 'debug',
              ],
      
              'daily' => [
                  'driver' => 'daily',
                  //下記を修正する
                  'path' => storage_path('logs/daily.log'),
                  'level' => 'debug',
                  'days' => 14,
              ],
      
              'slack' => [
                  'driver' => 'slack',
                  'url' => env('LOG_SLACK_WEBHOOK_URL'),
                  'username' => 'Laravel Log',
                  'emoji' => ':boom:',
                  'level' => 'critical',
              ],
      
              'papertrail' => [
                  'driver' => 'monolog',
                  'level' => 'debug',
                  'handler' => SyslogUdpHandler::class,
                  'handler_with' => [
                      'host' => env('PAPERTRAIL_URL'),
                      'port' => env('PAPERTRAIL_PORT'),
                  ],
              ],
      
              'stderr' => [
                  'driver' => 'monolog',
                  'handler' => StreamHandler::class,
                  'formatter' => env('LOG_STDERR_FORMATTER'),
                  'with' => [
                      'stream' => 'php://stderr',
                  ],
              ],
      
              'syslog' => [
                  'driver' => 'syslog',
                  'level' => 'debug',
              ],
      
              'errorlog' => [
                  'driver' => 'errorlog',
                  'level' => 'debug',
              ],
      
              'null' => [
                  'driver' => 'monolog',
                  'handler' => NullHandler::class,
              ],
      
              'emergency' => [
                  'path' => storage_path('logs/laravel.log'),
              ],
      
              //下記を追記
              'errors' => [
                  'driver' => 'daily',
                  'path' => storage_path('logs/error.log'),
                  'level' => 'error',
                  'days' => 14,
              ],
              //上記までを追記
          ],
      
      ];
      
  7. 確認

    1. testディレクトリで下記コマンドを実行してまだlogファイルが存在していないことを確認する。「No such file or directory」が出力されればsingle.logファイルとdaily.logは存在しない。

      $ ls storage/logs/daily*
      >ls: storage/logs/daily*: No such file or directory
      $ ls storage/logs/error*
      >ls: storage/logs/error*: No such file or directory
      
    2. testディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    3. ブラウザからtestアプリにアクセスする。デフォルトだとhttp://127.0.0.1:8000/にアクセスするとブラウザでtestアプリが表示できる。

    4. 下記画面が表示されていることを確認する。

      Laravel.png

    5. http://127.0.0.1:8000/user_homeにアクセスしてみる。(アクセスしても何も起こらず、先の画像と同じLaravelのトップページが表示されると思うがその動作は期待する動作である。)

    6. 二つのファイルに下記の一行が記載されていることを確認する。(YYYY-MM-DD HH:MM:SSはみなさんがhttp://127.0.0.1:8000/user_homeにアクセスした時間が入る。)

      test/storage/logs/laravel.log
      [YYYY-MM-DD HH:MM:SS] local.DEBUG: test 
      
    7. 下記画面右上の「LOGIN」をクリックしログイン画面に進む。

      Laravel.png

    8. なんでも良いのでE-Mail AddressとPasswordを入力して「Login」をクリックする。

      Laravel.png

    9. 下記の様なエラーが出る(このエラー画面は期待する画面である。)

      ?_SQLSTATE_HY000___1045__Access_denied_for_user__root___localhost___using_password__NO___SQL__select___from_`users`_where_`email`___shunokawa_gmail_com_limit_1_.png

    10. testディレクトリで下記コマンドを実行してログファイルを開く。

      $ less storage/logs/error.log
      
    11. 下記の様な出力が記載されていることを確認する。

      [2020-07-01 03:14:59] local.ERROR: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from `users` where `email` = shunokawa@gmail.com limit 1) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 1045): SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from `users` where `email` = shunokawa@gmail.com limit 1) at /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Connection.php:671)
      [stacktrace]
      #0 /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Connection.php(631): Illuminate\\Database\\Connection->runQueryCallback('select * from `...', Array, Object(Closure))
      #1 /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Connection.php(339): Illuminate\\Database\\Connection->run('select * from `...', Array, Object(Closure))
      #2 /Users/okawashun/test/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2203): Illuminate\\Database\\Connection->select('select * from `...', Array, true)
              ・
              ・
              ・
      
    12. 正常に書き込まれていた場合作業完了となる。

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む