- 投稿日:2019-09-29T22:25:33+09:00
Laravel5.8->6.0 へのバージョンアップ時につまずいた点
laravel/framework 6.0 にバージョンアップする際につまづいた点で、下記のコマンドを実行した際に下記のエラーとなりました。
composer update laravel/framework --with-dependenciescomposer update laravel/framework --with-dependencies Loading composer repositories with package information Updating dependencies (including require-dev) Your requirements could not be resolved to an installable set of packages. Problem 1 - Conclusion: remove fideloper/proxy 4.1.0 - Conclusion: don't install fideloper/proxy 4.1.0 - Conclusion: don't install laravel/framework v6.0.4 - Conclusion: don't install laravel/framework v6.0.3 - Conclusion: don't install laravel/framework v6.0.2 - Conclusion: don't install laravel/framework v6.0.1 - Installation request for fideloper/proxy (locked at 4.1.0, required as ^4.0) -> satisfiable by fideloper/proxy[4.1.0]. - Conclusion: don't install laravel/framework v6.0.0 - fideloper/proxy 4.1.0 requires illuminate/contracts ~5.0 -> satisfiable by laravel/framework[v5.8.17], illuminate/contracts[5.0.x-dev, 5.1.x-dev, 5.2.x-dev, 5.3.x-dev, 5.4.x-dev, 5.5.x-dev, 5.6.x-dev, 5.7.17, 5.7.18, 5.7.19, 5.7.x-dev, 5.8.x-dev, v5.0.0, v5.0.33, v5.1.1, v5.1.13, v5.1.16, v5.1.20, v5.1.22, v5.1.25, v5.1.28, v5.1.30, v5.1.31, v5.1.41, v5.1.8, v5.2.0, v5.2.19, v5.2.21, v5.2.24, v5.2.25, v5.2.26, v5.2.27, v5.2.28, v5.2.31, v5.2.32, v5.2.37, v5.2.43, v5.2.45, v5.2.6, v5.2.7, v5.3.0, v5.3.16, v5.3.23, v5.3.4, v5.4.0, v5.4.13, v5.4.17, v5.4.19, v5.4.27, v5.4.36, v5.4.9, v5.5.0, v5.5.16, v5.5.17, v5.5.2, v5.5.28, v5.5.33, v5.5.34, v5.5.35, v5.5.36, v5.5.37, v5.5.39, v5.5.40, v5.5.41, v5.5.43, v5.5.44, v5.6.0, v5.6.1, v5.6.10, v5.6.11, v5.6.12, v5.6.13, v5.6.14, v5.6.15, v5.6.16, v5.6.17, v5.6.19, v5.6.2, v5.6.20, v5.6.21, v5.6.22, v5.6.23, v5.6.24, v5.6.25, v5.6.26, v5.6.27, v5.6.28, v5.6.29, v5.6.3, v5.6.30, v5.6.31, v5.6.32, v5.6.33, v5.6.34, v5.6.35, v5.6.36, v5.6.37, v5.6.38, v5.6.39, v5.6.4, v5.6.5, v5.6.6, v5.6.7, v5.6.8, v5.6.9, v5.7.0, v5.7.1, v5.7.10, v5.7.11, v5.7.15, v5.7.2, v5.7.20, v5.7.21, v5.7.22, v5.7.23, v5.7.26, v5.7.27, v5.7.28, v5.7.3, v5.7.4, v5.7.5, v5.7.6, v5.7.7, v5.7.8, v5.7.9, v5.8.0, v5.8.11, v5.8.12, v5.8.14, v5.8.15, v5.8.17, v5.8.18, v5.8.19, v5.8.2, v5.8.20, v5.8.22, v5.8.24, v5.8.27, v5.8.28, v5.8.29, v5.8.3, v5.8.30, v5.8.31, v5.8.32, v5.8.33, v5.8.34, v5.8.35, v5.8.4, v5.8.8, v5.8.9]. - Can only install one of: laravel/framework[6.x-dev, v5.8.17]. - don't install illuminate/contracts 5.6.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.1|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.10|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.11|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.12|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.13|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.14|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.15|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.21|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.23|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.24|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.25|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.26|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.29|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.3|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.30|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.32|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.34|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.35|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.36|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.37|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.38|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.39|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.5|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.6|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.7|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.18|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.1|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.10|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.11|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.15|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.21|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.23|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.26|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.3|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.5|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.6|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.7|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.8.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.11|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.12|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.14|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.15|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.18|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.24|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.29|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.3|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.30|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.32|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.34|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.35|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.0.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.1.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.2.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.3.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.4.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.5.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.0.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.0.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.1|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.13|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.25|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.30|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.41|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.21|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.24|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.25|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.26|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.32|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.37|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.43|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.45|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.6|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.7|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.23|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.13|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.36|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.34|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.35|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.36|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.37|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.39|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.40|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.41|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.43|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.44|don't install laravel/framework 6.x-dev - Installation request for laravel/framework ^6.0 -> satisfiable by laravel/framework[6.x-dev, v6.0.0, v6.0.1, v6.0.2, v6.0.3, v6.0.4].その後の対応としては、 fideloper proxy 4.1.0 をcomposer.json から削除したり、laravel/frameworkをcomposer.jsonから削除したりしましたが同じエラーとなりました。(laravel/frameworkのエラー)
解決法
下記の操作で正常にlaravel6.0のインストールができました。
- 1.laravel/framework と、fideloper/proxy4.1.0 を composer.json から削除
- 2.composer update を実行Laravel5.8 -> 6.0での変更点での修正した部分
ユニットテストで落ちていた部分に関して下記の変更を行いました。
1. Langファサードのtrans メソッドが廃止
https://readouble.com/laravel/6.0/ja/upgrade.html#trans-and-trans-choice
→getメソッドに変更し対応しました。2. helper関数str_○○が廃止
https://qiita.com/sasakure-kei@github/items/adc64bed00e7c66996e2
テストではstr_random 関数が無くて落ちていました。
→Illuminate\Support\Str::randomメソッドに変更し対応しました。以上です。
- 投稿日:2019-09-29T17:54:26+09:00
Laravel5.8でブックマークアプリを作るチュートリアル(動画版)
Laravel5.8でブックマークアプリを作るチュートリアルを動画(Youtube)で作成しました。
いろいろ安定していない感ありますが、よろしかったらぜひ!第1回 インストール&初期設定編
Laravelのインストールから初期設定までを行なっています。
第2回 アプリケーションのデモ
なぜか2回目のアプリの動作デモです。
最終的にはちょっと変わってしまいましたが。第3回 Router編
アプリケーションの入り口であるルーターについて。
第4回 データベース編
マイグレーションでデータベースを構築して、シーダーでダミーデータを入れるところまで。
第5回 データベースのデータを表示しよう
登録したダミーデータからデータを取得して一覧ページを作成します。
第6回 詳細ページの作成
データベースからID検索でレコードを取得して、詳細ページを作成します。
詳細ページ用のルーティングやモデルバイディングの解説もしてます。第7回 レコード追加機能の作成
データベースにレコードを新規登録する機能を作成します。
第8回 レコード更新機能の作成
レコードの更新機能の作成と、ビューファイルを共通ファイルにしてインクルードする方法。
第9回 レコードの削除とフラッシュメッセージ
レコードの削除機能とフラッシュメッセージを作成します。
第10回 入力フォームのチェック機能(バリデーション)
入力フォームのチェック(バリデーション)機能を作成します。
第11回 ユーザー登録・認証機能の作成
ユーザー認証・登録機能を作成します。主にビューファイルの編集です。
第12回 タグCRUD(作成・読み込み・更新・削除)機能の作成
今までのおさらいも兼ねて、タグのCRUD機能の作成します。
第13回 データベースのリレーション設定(ブックマークとタグの関連付け)
今までのおさらいも兼ねて、タグCRUD機能の作成します。
第14回 リレーション(タグ)の表示とデバッグツールについて
設定したリレーション(タグ)の表示とデバッグツール(Clockwork)を使用して、クエリの確認を行います。
ソースコードはこちら
https://github.com/k-ishiwata/BookmarkApp
- 投稿日:2019-09-29T16:09:45+09:00
さくらサーバーに画像を転送できない
git pull origin master で画像が転送できない
php artisan serveで起動した開発環境では読み込めていた画像が、さくらにGitで転送しようとしたら読めなかった。
そもそもgithubに転送されていない。gitignoreを見てそれらしい箇所を外してみたがうまくいかない。
よく考えたらgithubはソースコード保管するところだし、画像は無理とか?
もしくは容量制限とかコマンドが別?フォルダが作れない
ファイル転送ソフトのFileZilaならどうかと思い、これでpublicフォルダに転送してみたら読み込めるようになった。
が、さすがにフォルダで分けたいと思い、サブディレクトリを作ろうとすると作ってフォルダを再読み込みすると消えてしまう。
FileZilaからパーミッションを確認するも755だったから読めるはず。
試しに777にしてもやっぱりダメだった。ターミナルからはフォルダを作れる。
ターミナルでpublicフォルダに入ってmkdirしたら普通に作れた。
一度、作成したディレクトリにはFTPソフトからでも転送できた。とりあえず解決はしたものの理由は分からないまま。
補足
今回は関係なかったが、 .htaccessをどうにかすると治るパターンもあるらしいのでこれでうまくいかなかった人はそれでググってください。
- 投稿日:2019-09-29T12:08:42+09:00
SlackBotに挑戦(2) - Request Varification
SlackBotをまじめに学ぶ(2回目)
はじめに
前回、Heroku上にウェブアプリケーションを構築し、Slackワークスペースからスラッシュコマンドを受け取るところまでやりました。インターネット上にSlackからのリクエストを受け付ける先を公開したわけですが、送信元がSlackに限られるわけではなく、悪意があれば誰でもリクエストを送ることができるので、怖いですね。
ということで、公開したAPIへのリクエストが、自分が作ったSlack Appから送られたものかを検証する方法を実装しておきます。ここに英語で書いてあることを、PHPとLaravelでやっているだけです。
https://api.slack.com/docs/verifying-requests-from-slack今回使う環境
- Heroku
- PHP 7.3
- Laravel 6.0.3
- Clear DB
- Windows
- PHP 7.2.11
- Laravel 6.0.3
- Maria DB Ver 15.1
前回どおり、基本的にはWindowsでの作業です。
やってみよう
検証方法は2つあります。1つ目は推奨されていないのでさらっと行きます
1. Verification Token
この方法は推奨されていません。
何もしないより良いかなと思いますが、in comming monthで完全になくなると言っているので危ないかもしれません。Verification token deprecation
We'll continue allowing apps to use verification tokens for now. However, we will retire them completely in coming months. We strongly recommend switching to request signing as soon as possible.Basic InformationにあるVerification Tokenの値をメモします。
スラッシュコマンドのパラメータの一つとして、
Verification Token
の値がそのまま渡されます。
自分で作ったアプリケーションは、Basic Informationに表示されているTokenの値と、リクエストで渡ってきたTokenの値が一致するかを調べるだけです。一致するときは、正しいSlackのサーバーからきたと見なすことになります。Verification Tokenの値を秘密にしておく必要があります。
2. Signing Secret
こちらが新しく推奨されている
Signing Secret
という方法です。検証手順は以下のとおりです。
Signing Secret
をBasic Informationから調べる- リクエストヘッダーの
X-Slack-Request-Timestamp
を取得する- リクエストボディを無加工で取得する
- Slackが決めたルールで文字列を結合する
Signing Secret
と4で作った文字列から、sha256のハッシュ値をとる- リクエストヘッダーの
X-Slack-Signature
で渡ってきた値と比較する- 一致するときは正しいリクエストとみなす
これをLaravelで実装していきます。
Controller
まずは、新しいContoroller(VerificationController.php)を作り、verifyメソッドとして実装します。
app/VerificationController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Log; class VerificationController extends Controller { public function verify(Request $request){ $timestamp = $request->header('x-slack-request-timestamp'); $signature = $request->header('x-slack-signature'); $requestBody = $request->getContent(); $secret = config('app.slack.signing_secret'); $sigBasestring = 'v0:' . $timestamp . ':' . $requestBody; $hash = 'v0=' . hash_hmac('sha256', $sigBasestring, $secret); $debug = ['Timestamp'=>$timestamp, 'Body'=>$requestBody, 'Sig'=>$sigBasestring, 'Secret'=>substr_replace($secret,'*',5), 'Hash'=>$hash, 'Signature'=>$signature,]; return response()->json($debug); } }特に解説は不要ですね。
取得した値と計算した結果をreturnするだけのものです。route設定
作ったメソッドを
/api/verify-test
でアクセスできるように登録します。エンドポイントは、https://slalack-bot.herokuapp.com/api/verify-test になります。routes/api.phpRoute::any('/verify-test', 'VerificationController@verify');config/.env設定
.envにSigning Secretの値を登録する。
HerokuのConfigにセットするのを忘れずに。.envSLACK_SIGNING_SECRET=70cad**********Laravelのconfig経由で、Signing Secretが取れるように登録します。
config/app.php/* |-------------------------------------------------------------------------- | Class Aliases |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application | is started. However, feel free to register as many as you wish as | the aliases are "lazy" loaded so they don't hinder performance. | */ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, //省略 ], //ここ追加 'slack' => ['signing_secret'=>env('SLACK_SIGNING_SECRET')], ];Herokuにデプロイすると、以下のURLでアクセスできるようなります。
https://slalack-bot.herokuapp.com/api/verify-testスラッシュコマンド登録
Slackから/verify-testで呼び出すコマンドを登録します。RequestURLは https://slalack-bot.herokuapp.com/api/verify-test に設定します。
動作確認
slackのメッセージボックスから/verify-testを呼びます。追加のメッセージは何でも構いません。
だらだらとJSONがかえってきていますが、大事なのは最後の2つだけです。Hashが自分で計算して作った値、SignatureがSlackから送られてきた値です。両者が一致しているので実装方法に誤りはなさそうです。
一致しているので、このリクエストはSlackから送られてきた正規なリクエストとみなして良いということです。"Hash":"v0=098ea4338850dc6004b89d24f2a2d06ac12f6f138121df9ad0a74bec8db32521" "Signature":"v0=098ea4338850dc6004b89d24f2a2d06ac12f6f138121df9ad0a74bec8db32521"LaravelのMiddleware化する
各コントローラのメソッドでverifyメソッドと同じことをするのは面倒なので、Laravelのmiddlewareに実装して自動適用するように変えてみます。
Middlewareクラスの生成
artisanコマンドでひな型を作ります。
php artisan make:middleware SlackRequestVerification Middleware created successfully.検証ロジックを実装
作られたひな形の
handle
メソッドに検証ロジックを実装します。VerificationControllerに書いた処理をそのまま持ってくるだけです。App\Http\Middleware\SlackRequestVerification<?php namespace App\Http\Middleware; use Closure; use Log; class SlackRequestVerification { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $timestamp = $request->header('x-slack-request-timestamp'); $signature = $request->header('x-slack-signature'); $requestBody = $request->getContent(); $secret = config('app.slack.signing_secret'); $sigBasestring = 'v0:' . $timestamp . ':' . $requestBody; $hash = 'v0=' . hash_hmac('sha256', $sigBasestring, $secret); $debug = ['Timestamp'=>$timestamp, 'Body'=>$requestBody, 'Sig'=>$sigBasestring, 'Secret'=>substr_replace($secret,'*',5), 'Hash'=>$hash, 'Signature'=>$signature,]; \Log::debug($debug); //不一致なら500で終わり if( $hash !== $signature ){ return response()->json([ 'ok'=>false, 'error' => 'signature error', ], '500'); } //念のため、verificationをした証拠を入れておく $verified = [ 'slack_signing_verification'=>true, 'slack_use_secret'=>substr_replace($secret,'*',5), 'slack_verify_hash'=>$hash, ]; $request->merge($verified); //次の処理へ return $next($request); } }Middlewareの登録
HttpのKernelに登録します。今回はSlackからのリクエストはすべて
/api/*
で受けるので、apiのmiddlewareグループに登録しました。app/Http/Kernel.php/** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ //ここに追加 \App\Http\Middleware\SlackRequestVerification::class, 'throttle:60,1', 'bindings', ], ];ここまでの変更をHerokuにデプロイします。
動作確認
正常動作
無事、middlewareを経由して処理されて、Verificationが正常に終わり、Controllerに処理が伝わりました。middlewareでrequestに追加した3つの値も確認できました。
エラー
ブラウザでGETのリクエストを送ってみると、エラーメッセージが受け取れます。
https://slalack-bot.herokuapp.com/api/debug{"ok":false,"error":"signature error"}まとめ
Slack Signing VerificationをLaravelアプリに実装しました。Slackのサーバーから正しく届いたメッセージであることを確認する方法を入れたので、安心感が増しました。
参考資料
- 投稿日:2019-09-29T11:14:18+09:00
Docker + Laravel で躓いていた点
Laravel を触ってみよう、ということで Mac 上の Docker に入れてみようとしましたが、躓いた点があったためメモ。
Laravel は初めてですし、Docker もちょっと触った程度なので、非常につまらないつまづきです。ちなみに Dokcer のイメージは、以下のを使用
PHP 用コンテナ
FROM php:7.1-apache COPY php.ini /usr/local/etc/php/ RUN apt-get update \ && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev \ && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcryptMySQL 用コンテナ
FROM mysql:5.7 COPY ./my.cnf /etc/mysql/conf.dいずれも、
cat /etc/issue
Debian GNU/Linux 9 \n \l
1. artisan が実行できない。
Voyager を入れようと思って、
php artisan voyager:install
とコマンドを打つと、
Could not open input file: artisan
と出てしまいました。ええ?と思ったのですが、artisan はプロジェクトのルート(artisan ファイルが置かれているディレクトリ)で実行しないといけない、というだけでした。2. Laravel から MySQL につながらない
Laravel をインストールし終えて http://localhost/ が表示されるようになり、プロジェクト用のデータベースを作成し、次に
php artisan migrate
しようとしたのですが、
SQLSTATE[HY000] [2002] No such file or directory
と出てしまい、失敗します。
.env
の DB_HOST の値を、localhost
,127.0.0.1
, MySQL のコンテナ名に変えるなどしてみますが、いずれもダメ。原因と対応
Mac のターミナルから
php artisan migrate
のコマンドを打っていたのが原因でした(それだけ >_<)。
docker exec -it PHPのコンテナ名 /bin/bash
でコンテナにログインして、 laravel プロジェクトのルートディレクトリからphp artisan migrate
する必要がありました。ちなみに、 試行錯誤の中、DB_HOST 名を以下のように指定した場合のメッセージをそれぞれ書き出してみます。
localhost の場合
SQLSTATE[HY000] [2002] No such file or directory
127.0.0.1 の場合
SQLSTATE[HY000] [2002] Connection refused
MySQL のコンテナ名の場合
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known
MySQL コンテナのIPアドレスの場合
SQLSTATE[HY000] [2002] Operation timed out
※ コンテナのIPアドレスはdocker exec -it MySQLのコンテナ名 /bin/bash
でログインして、cat /etc/hosts
で確認できます。3. localhost/admin が Not Found
Voyager のインストールも終わって、いざ http://localhost/admin にアクセスしたのですが、 Not Found。
うーん、と思ったのですが、 apache の mod_rewrite が有効になっていないだけでした。
/etc/apache2/mods_available/rewrite.load
を/etc/apache2/mods_enabled
に移してコンテナを再起動すればOKでした。終わりに
問題が、Laravel にあるのか Voyager にあるのか Docker にあるのか、Docker なら docker-compose.yml にあるのか確認すべき箇所がたくさんあって難儀しました。
少しでも参考になれば幸いです。自身は、そのうちまた同じところでつまづきそう。
- 投稿日:2019-09-29T11:02:01+09:00
Laravel Statsを使ったソースコードの分析
2019年9月1日にv2.0がリリースされました?
v2.0になってからこのパッケージの存在を知ったので、写経用に作成していたLaravelプロジェクトの更新を兼ねてインストールしてみました。
インストール条件
v2.0を使用する場合は次の条件を満たしている必要があります。
- PHP 7.2以上
- Laravel v5.8以上もしくはLumen v5.8以上
Lumenでも使用可能とのことですが、今回はLaravelでの使用方法を記述します。
インストール
次のコマンドを実行することでインストールできます。
$ composer require "wnx/laravel-stats" --devサービスプロバイダーの設定は自動で行われますが、手動で行う場合は
config/app.php
に次のコードを追加できます。'providers' => [ // ... \Wnx\LaravelStats\StatsServiceProvider::class, ]別途コンフィグファイルを作成する場合は以下のコマンドを実行することで作成されます。
$ php artisan vendor:publish --provider="Wnx\LaravelStats\StatsServiceProvider"実行が完了すると以下のようなファイルが
config/stats.php
として作成されます。(以下のコードはコメントを書き換えています。)<?php return [ /* * 出力対象のパス */ 'paths' => [ base_path('app'), base_path('database'), base_path('tests'), ], /* * 出力対象外とするファイル・ディレクトリ */ 'exclude' => [ base_path('tests/bootstrap.php'), // base_path('app/helpers.php'), // base_path('app/Services'), ], /* * 独自で出力対象を増やす場合はここに追加する。後述。 */ 'custom_component_classifier' => [ // \App\Classifiers\CustomerExportClassifier::class ], /* * 対象外とするルール。 * デフォルトではvendorディレクトリ以下とコアクラスが対象外となっている。 * * 以下の2ファイルがデフォルトで用意されている。 * - \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class * - \Wnx\LaravelStats\RejectionStrategies\RejectInternalClasses::class * * 上記ファイルのルール以外にしたい場合は、`Wnx\LaravelStats\Contracts\RejectionStrategy`を実装したクラスを別途作成する必要がある。 */ 'rejection_strategy' => \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class, /* * 対象外とする名前空間。 * `Str::startsWith()`で対象外かを判別している。 * * `Illuminate`を指定することでIlluminate全体を対象外に出来る。 * また`Illuminate\Support`のように一部を対象外にすることも可能。 */ 'ignored_namespaces' => [ 'Wnx\LaravelStats', 'Illuminate', 'Symfony', ], ];使い方
artisan
コマンドで実行することができます。$ php artisan stats
以下の画像のような出力結果になります。
オプション
オプション 説明 --json json形式で出力 --components[=COMPONENTS] 出力対象を指定して出力 -h, --help ヘルプの表示 -q, --quiet 結果を出力しない -V, --version バージョンの表示 --ansi ANSIで出力 --no-ansi ANSIで出力しない -n, --no-interaction 対話形式にしない --env[=ENV] 実行環境を指定して出力 -v, -vv, -vvv, --verbose 出力メッセージを詳細にする。
-v, -vv, -vvv
を実行してみましたが、私が実行した環境では出力結果が変わりませんでした?
-v, -vv, -vvv
については下記がヘルプに記載されています。Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
出力の分類方法
Laravel Statsでは以下の条件で分類しています。
分類 条件 Controller ルーティングに登録されている。 php artisan route:list
に表示されるコントローラModel Illuminate\Database\Eloquent\Model
が継承されているクラスCommand Illuminate\Console\Command
が継承されているクラスRule Illuminate\Contracts\Validation\Rule
が継承されているクラスPolicy AuthServiceProvider
に登録されているポリシーMiddleware App\Http\Kernel
に登録されているミドルウェアEvent Illuminate\Foundation\Events\Dispatchable
トレイトを使用しているクラスEvent Listener EventServiceProvider
に登録されているクラスIlluminate\Mail\Mailable
が継承されているクラスNotification Illuminate\Notifications\Notification
が継承されているクラスNova Action Laravel\Nova\Actions\Action
が継承されているクラスNova Filter Laravel\Nova\Filters\Filter
が継承されているクラスNova Lens Laravel\Nova\Lenses\Lens
が継承されているクラスNova Resource Laravel\Nova\Resource
が継承されているクラスJob Illuminate\Foundation\Bus\Dispatchable
トレイトを使用しているクラスMigration Illuminate\Database\Migrations\Migration
が継承されているクラスRequest Illuminate\Foundation\Http\FormRequest
が継承されているクラスResource Illuminate\Http\Resources\Json\Resource
,Illuminate\Http\Resources\Json\JsonResource
またはIlluminate\Http\Resources\Json\ResourceCollection
が継承されているクラスSeeder Illuminate\Database\Seeder
が継承されているクラスServiceProvider Illuminate\Support\ServiceProvider
が継承されているクラスDusk Tests Laravel\Dusk\TestCase
が継承されているクラスBrowserKit Test Laravel\BrowserKitTesting\TestCase
が継承されているクラスPHPUnit Test PHPUnit\Framework\TestCase
が継承されているクラス出力分類の追加
プロジェクト毎に作成しているファイルを分析対象にする場合は、
Wnx\LaravelStats\Contracts\Classifier
を実装したクラスを作成することで分析対象とすることができます。例として
app/Classifiers/RepositoryClassifier.php
を作成すると以下のようなファイルになります。<?php namespace App\Classifiers; use Wnx\LaravelStats\ReflectionClass; use Wnx\LaravelStats\Contracts\Classifier; class RepositoryClassifier implements Classifier { /** * 出力時の分類名 * この場合はRepositoriesで表示される */ public function name(): string { return 'Repositories'; } /** * 出力対象とする条件 */ public function satisfies(ReflectionClass $class): bool { return $class->isSubclassOf(\App\Repositories\BaseRepository::class); } /** * Code LLoCに行数を含めるか */ public function countsTowardsApplicationCode(): bool { return true; } /** * Test LLoCに行数を含めるか */ public function countsTowardsTests(): bool { return true; } }作成したファイルを
config/stats.php
のcustom_component_classifier
に追加することで出力対象が追加されます。<?php ... 'custom_component_classifier' => [ \App\Classifiers\RepositoryClassifier::class ], ...あとがき
このパッケージをインストールすることでファイルごとの行数やメソッド数、クラス数を分析することでどこが複雑になっているかを手軽に調べることができるようになると思います。
Laravel StatsとPHP Insightsを併せて利用することでよりプロジェクトのコード分析が捗ると思うので一度使用してみてはいかがでしょうか。
参考
- stefanzweifel/laravel-stats
- Release v2.0.0 · stefanzweifel/laravel-stats
- 追加機能やv1からのアップデート手順について書かれています
- Laravel Stats 2.0 is Here - Laravel News
- 投稿日:2019-09-29T09:58:46+09:00
Laravel 5.8 の assertDatabaseHas を使用したさい、日本語(unicode)がエスケープされる問題の修正方法
問題
assertDatabaseHasでテストが失敗したとき$this->call('PATCH', '/api/users/1', ['name' => 'ほげほほげ']); $this->assertDatabaseHas('users', ['name' => 'ふがふが']);データベース内のマルチバイトが正しく表示されない# There was 1 failure: # # 1) Tests\Feature\UsersControllerTest::testUsersUpdate # Failed asserting that a row in the table [users] matches the attributes { # "title": "\u3075\u304c\u3075\u304c" # }. # # Found: [ # { # "id": 1, # "title": "\u307b\u3052\u307b\u307b\u3052", # "created_at": "2019-09-29 09:33:59", # "updated_at": "2019-09-29 09:33:59" # } # ].結論
文字化けの原因は class InteractsWithDatabase 内で使用している
json_encode
の第2引数がJSON_PRETTY_PRINT
のみになっているため。これは、
./tests/TestCase.php
でassertDatabaseHas
でオーバーライドして引数を修正できる./tests/TestCase.php<?php namespace Tests; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase { use CreatesApplication; /** * @see github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Testing/Concerns/InteractsWithDatabase.php#L21 */ protected function assertDatabaseHas($table, array $data, $connection = null) { $this->assertThat( $table, new HasInDatabaseMb($this->getConnection($connection), $data) ); return $this; } }
class BaseTestCase > trait InteractsWithDatabase > class HasInDatabase
のような依存で、実際の出力整形はHasInDatabase
クラスのメソッドが行っているため、json_encodeを使用しているメソッドを上書きして新しいクラス./tests/HasInDatabaseMb.php
とする。./tests/HasInDatabaseMb.php<?php namespace Tests; use Illuminate\Foundation\Testing\Constraints\HasInDatabase; class HasInDatabaseMb extends HasInDatabase { /** * @see github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Testing/Constraints/HasInDatabase.php#L66 */ protected function getAdditionalInfo($table) { $results = $this->database->table($table)->get(); if ($results->isEmpty()) { return 'The table is empty'; } $description = 'Found: '.json_encode($results->take($this->show), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); if ($results->count() > $this->show) { $description .= sprintf(' and %s others', $results->count() - $this->show); } return $description; } /** * @see github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Testing/Constraints/HasInDatabase.php#L84 */ public function toString($options = 0): string { return json_encode($this->data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } }上記はオリジナルのソースコードの
json_encode
の第2引数を
JSON_PRETTY_PRINT
から↓
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE
に変更を行い、それ以外は変更していない。
以上のようにしてassertDatabaseHas
メソッドをオーバーライドすれば、テスト失敗時に日本語が表示されるようになる。# Time: 1.69 seconds, Memory: 24.00 MB # # There was 1 failure: # # 1) Tests\Feature\UsersControllerTest::testUsersUpdate # Failed asserting that a row in the table [users] matches the attributes { # "title": "ふがふが" # }. # # Found: [ # { # "id": 1, # "title": "ほげほほげ", # "created_at": "2019-09-29 09:50:00", # "updated_at": "2019-09-29 09:50:00" # } # ].
- 投稿日:2019-09-29T09:54:55+09:00
【laravel5.8】ログイン関連ページ、バリデーションメッセージ、メールの日本語化
php artisan make:auth
でログイン機能を追加して、$this->middleware('verified');
などでメール認証を追加した。
その際に追加されたログイン関連ページ、バリデーションメッセージ、メールが英語だったので日本語化する。ログイン関連ページとバリデーションメッセージの日本語化は簡単にできたけど、メールが大変だった。
環境
- PHP: 7.3.8
- Laravel: 5.8.35
ログイン関連ページとバリデーションメッセージの日本語化
config/app.php
のlocale
とfallback_locale
をen
からja
に変更する。config/app.php/* // 省略 |-------------------------------------------------------------------------- | Application Locale Configuration |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used | by the translation service provider. You are free to set this value | to any of the locales which will be supported by the application. | */ 'locale' => 'ja', /* |-------------------------------------------------------------------------- | Application Fallback Locale |-------------------------------------------------------------------------- | | The fallback locale determines the locale to use when the current one | is not available. You may change the value to correspond to any of | the language folders that are provided through your application. | */ 'fallback_locale' => 'ja', // 省略
resource/lang
直下にja
ディレクトリを作成し、resource/lang/en
ディレクトリ直下のファイルをja
ディレクトリに全てコピーする。resource/lang/en/validation.php<?php return [ /* |-------------------------------------------------------------------------- | Validation Language Lines |-------------------------------------------------------------------------- | | The following language lines contain the default error messages used by | the validator class. Some of these rules have multiple versions such | as the size rules. Feel free to tweak each of these messages here. | */ 'accepted' => 'The :attribute must be accepted.', // 右側のvalueを日本語化する 'active_url' => 'The :attribute is not a valid URL.', 'after' => 'The :attribute must be a date after :date.', 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', 'alpha' => 'The :attribute may only contain letters.', // 省略 ];
validation.php
を例に挙げると、戻り値の配列に連想配列が指定されており、
その連想配列のvalueを日本語に直す。
有志が日本語に直してくれているので、ググって持ってきてもよい。
resources/views/auth/login.blade.php
などにある{{ __('E-Mail Address') }}
や{{ __('Password') }}
の日本語化を行う。resources/lang
直下にja.json
を作成する。resources/lang/ja.json{ "E-Mail Address": "メールアドレス", "Password": "パスワード" }他にも日本語化したい内容があれば、追加で記述する。
メールの日本語化
以下の2つの作業が必要。
1. 新規にNotificationを作成し、Userモデルで継承しメソッドを使用するようにする
2. viewの日本語化Notificationの作成と継承
php artisan make:notification [好きな名前]上記のコマンドでNotificationを作成する。名前を好きなものでよい。
パスワードリセットメールとメール認証メールのために、2つ作成する。
ここでは、パスワードリセット用を、ResetPasswordJa
とし、メール認証用をVerifyEmailJa
とした。
基のResetPassword(vendor/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php
)とVerifyEmail(vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php
)の内容をコピペし、toMail
メソッドの中身を日本語に書き換える。app/Notifications/ResetPasswordJa.php<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; class ResetPasswordJa extends Notification { use Queueable; /** * Create a new notification instance. * * @return void */ public function __construct($token) { $this->token = $token; } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->from('admin@example.com', config('app.name')) ->subject('パスワード再発行') ->line('パスワード再発行リクエストがありましたので、メッセージ送信しました。') ->action('パスワード再設定', url(config('app.url').route('password.reset', $this->token, false))) ->line('もし心当たりがない場合は、本メッセージは破棄してください。'); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } }app/Notifications/VerifyEmailJa.php<?php namespace App\Notifications; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\URL; use Illuminate\Support\Facades\Lang; use Illuminate\Notifications\Notification; use Illuminate\Notifications\Messages\MailMessage; class VerifyEmailJa extends Notification { /** * The callback that should be used to build the mail message. * * @var \Closure|null */ public static $toMailCallback; /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Build the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { if (static::$toMailCallback) { return call_user_func(static::$toMailCallback, $notifiable); } return (new MailMessage) ->subject(Lang::getFromJson('本登録メール')) ->line(Lang::getFromJson('以下の認証リンクをクリックして本登録を完了させてください。')) ->action( Lang::getFromJson('メールアドレスを認証する'), $this->verificationUrl($notifiable) ) ->line(Lang::getFromJson('もしこのメールに覚えが無い場合は破棄してください。')); } /** * Get the verification URL for the given notifiable. * * @param mixed $notifiable * @return string */ protected function verificationUrl($notifiable) { return URL::temporarySignedRoute( 'verification.verify', Carbon::now()->addMinutes(60), ['id' => $notifiable->getKey()] ); } /** * Set a callback that should be used when building the notification mail message. * * @param \Closure $callback * @return void */ public static function toMailUsing($callback) { static::$toMailCallback = $callback; } }
app/User.php
においてこの2つをuse
宣言し、sendPasswordResetNotification
メソッドとsendEmailVerificationNotification
メソッドをオーバーライドして書き換える。app/User.php// 省略 use App\Notifications\ResetPasswordJa as ResetPasswordNotificationJa; use App\Notifications\VerifyEmailJa as VerifyEmailNotificationJa; // 省略 public function sendPasswordResetNotification($token) { $this->notify(new ResetPasswordNotificationJa($token)); } public function sendEmailVerificationNotification() { $this->notify(new VerifyEmailNotificationJa()); }viewの日本語化
メールのviewが見えていないので、
php artisan vendor:publish
を実行する。
resources/views/vendor/notifications/email.blade.php
が作成されるので編集する。
以下のように英語の部分を書き換える。resources/views/vendor/notifications/email.blade.php@component('mail::message') {{-- Greeting --}} @if (! empty($greeting)) # {{ $greeting }} @else @if ($level === 'error') # @lang('Whoops!') @else # @lang('こんにちは。') @endif @endif {{-- Intro Lines --}} @foreach ($introLines as $line) {{ $line }} @endforeach {{-- Action Button --}} @isset($actionText) <?php switch ($level) { case 'success': case 'error': $color = $level; break; default: $color = 'primary'; } ?> @component('mail::button', ['url' => $actionUrl, 'color' => $color]) {{ $actionText }} @endcomponent @endisset {{-- Outro Lines --}} @foreach ($outroLines as $line) {{ $line }} @endforeach {{-- Salutation --}} @if (! empty($salutation)) {{ $salutation }} @else {{ config('app.name') }} @lang('より') @endif {{-- Subcopy --}} @isset($actionText) @slot('subcopy') @lang( "もし、\":actionText\"ボタンがうまく機能しない場合、\n以下のURLをコピーしてください。\n". ': [:actionURL](:actionURL)', [ 'actionText' => $actionText, 'actionURL' => $actionUrl, ] ) @endslot @endisset @endcomponent以上で一通り日本語になっていると思います。
いつか書き直します。