以前、誤ってLTS版(サポートが長いバージョン)でないLaravel5.6を使用していることに気づき、Laravel5.5にダウングレードさせた時に、大きく影響が出た箇所がありました。
変更点について
変更点すべてを挙げていったらキリがないので、
今回は特に私がハマった部分について解説していきます。
詳しい変更点はLaravelの公式ドキュメントに記載されています。
https://readouble.com/laravel/5.6/ja/upgrade.html
①ログ関連
大きな変更として、5.6ではログの設定を /config/logging.php でしていましたが、
5.5では上記ファイルは存在しないため、 /config/app.php にログ設定の記述が必要でした。
具体的には以下のように app.php に記載します。
各値は、envで管理するようにしています。
'log' => env('APP_LOG', 'single'), 'log_level' => env('APP_LOG_LEVEL', 'debug'), 'log_max_files' => env('APP_LOG_MAX_FILES', 5),
envファイルで一部ログ設定の値を管理していたので、普通なら入ることがない値が設定されてしまい、アプリがまったく動かず、原因を突き止めるのに少し時間がかかってしまいました。
②Ajax
2つ目にハマってしまったのがAjaxでした。
以下のようなjQueryのコードを書いていたのですが、まったく動かなくなってしまっていました。
$.post({ url: "/ajax/test", dataType: 'json', data: {data: "xxxxxx"}, }).done(function (data) { // 成功時処理 }).fail(function (XMLHttpRequest, textStatus, errorThrown) { // 失敗時処理 }).always(function () { // 成功失敗どちらでも行う処理 });
前提としてLaravelでは、クロス・サイト・リクエスト・フォージェリ(CSRF)からアプリケーションを守るために、特殊な設定をしない限りは、POST通信をする際には「csrfトークン」をパラメータに含める必要があります。
調べてみたところ、Laravelの5.5ではAjaxでもPOST通信を行う際には「csrfトークン」が必要なようでした。
5.6ではなぜ不要になったのでしょうか。。。
上記から対応方法を3つほど考えました。
①指定のAjaxの処理をトークン対象外にする
②GET通信にする
③CSRFトークンを付与する
順番に紹介していきます。
①指定のAjaxの処理をトークン対象外にする
詳細は公式ドキュメントにあります。
https://readouble.com/laravel/5.5/ja/csrf.html#csrf-excluding-uris
app/http/Middleware/VerifyCsrfToken.php に以下のように記述するだけでOK。
protected $except = [ 'ajax/test', ];
②GET通信にする
先ほどのAjaxのコードを以下のように変更します。
あとは呼び出されるコントローラがPOSTに合わせた書き方になっているはずなので、GETに合わせた書き方に変更すればOK。
$.ajax({ type: 'get', url: "/ajax/test", dataType: 'json', data: {data: "xxxxxx"}, }).done(function (data) { // 成功時処理 }).fail(function (XMLHttpRequest, textStatus, errorThrown) { // 失敗時処理 }).always(function () { // 成功失敗どちらでも行う処理 });
③CSRFトークンを付与する
この方法が一番安全なのではないかと思います。
headタグの中にmetaタグとしてcsrfトークンが入っているはずなので、それを利用します。
metaタグの値(トークンの文字列)を取得して、以下のように送信パラメータに、トークンを付与すればOK。
<meta name="csrf-token" content="トークンの文字列" /> <script> const csrf_token = $('meta[name="csrf-token"]').attr('content'); $.post({ url: "/ajax/test", dataType: 'json', data: {data: "xxxxxx", _token: csrf_token}, }).done(function (data) { // 成功時処理 }).fail(function (XMLHttpRequest, textStatus, errorThrown) { // 失敗時処理 }).always(function () { // 成功失敗どちらでも行う処理 }); </script>
まとめ
以上が私がハマった変更点と、その対応でした。
ダウングレードしなければならない状況にならないように、案件の立ち上げ時の確認事項に含めるだったり、部や課の標準としてしっかり決めておかなければいけないと感じました。
Laravelも新しいLTS版のVer6.0が出ましたので、少し様子を見てから見直すのもいいかもしれないですね。