20190929のlaravelに関する記事は8件です。

Laravel5.8->6.0 へのバージョンアップ時につまずいた点

laravel/framework 6.0 にバージョンアップする際につまづいた点で、下記のコマンドを実行した際に下記のエラーとなりました。

composer update laravel/framework --with-dependencies
 composer 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での変更点での修正した部分

ユニットテストで落ちていた部分に関して下記の変更を行いました。

以上です。

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

Laravel5.8でブックマークアプリを作るチュートリアル(動画版)

Laravel5.8でブックマークアプリを作るチュートリアルを動画(Youtube)で作成しました。
いろいろ安定していない感ありますが、よろしかったらぜひ!

第1回 インストール&初期設定編

Laravelのインストールから初期設定までを行なっています。

第1回 インストール&初期設定編

第2回 アプリケーションのデモ

なぜか2回目のアプリの動作デモです。
最終的にはちょっと変わってしまいましたが。

第2回 アプリケーションのデモ

第3回 Router編

アプリケーションの入り口であるルーターについて。

第3回 Router編

第4回 データベース編

マイグレーションでデータベースを構築して、シーダーでダミーデータを入れるところまで。

第4回 データベース編

第5回 データベースのデータを表示しよう

登録したダミーデータからデータを取得して一覧ページを作成します。

第5回 データベースのデータを表示しよう

第6回 詳細ページの作成

データベースからID検索でレコードを取得して、詳細ページを作成します。
詳細ページ用のルーティングやモデルバイディングの解説もしてます。

第6回 詳細ページの作成

第7回 レコード追加機能の作成

データベースにレコードを新規登録する機能を作成します。

第7回 レコード追加機能の作成

第8回 レコード更新機能の作成

レコードの更新機能の作成と、ビューファイルを共通ファイルにしてインクルードする方法。

第8回 レコード更新機能の作成

第9回 レコードの削除とフラッシュメッセージ

レコードの削除機能とフラッシュメッセージを作成します。

第9回 レコードの削除とフラッシュメッセージ

第10回 入力フォームのチェック機能(バリデーション)

入力フォームのチェック(バリデーション)機能を作成します。

第10回 入力フォームのチェック機能(バリデーション)

第11回 ユーザー登録・認証機能の作成

ユーザー認証・登録機能を作成します。主にビューファイルの編集です。

第11回 ユーザー登録・認証機能の作成

第12回 タグCRUD(作成・読み込み・更新・削除)機能の作成

今までのおさらいも兼ねて、タグのCRUD機能の作成します。

第12回 タグCRUD(作成・読み込み・更新・削除)機能の作成

第13回 データベースのリレーション設定(ブックマークとタグの関連付け)

今までのおさらいも兼ねて、タグCRUD機能の作成します。

第13回 データベースのリレーション設定(ブックマークとタグの関連付け)

第14回 リレーション(タグ)の表示とデバッグツールについて

設定したリレーション(タグ)の表示とデバッグツール(Clockwork)を使用して、クエリの確認を行います。

第14回 リレーション(タグ)の表示とデバッグツールについて

ソースコードはこちら
https://github.com/k-ishiwata/BookmarkApp

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

さくらサーバーに画像を転送できない

git pull origin master で画像が転送できない

php artisan serveで起動した開発環境では読み込めていた画像が、さくらにGitで転送しようとしたら読めなかった。
そもそもgithubに転送されていない。

gitignoreを見てそれらしい箇所を外してみたがうまくいかない。

よく考えたらgithubはソースコード保管するところだし、画像は無理とか?
もしくは容量制限とかコマンドが別?

フォルダが作れない

ファイル転送ソフトのFileZilaならどうかと思い、これでpublicフォルダに転送してみたら読み込めるようになった。
が、さすがにフォルダで分けたいと思い、サブディレクトリを作ろうとすると作ってフォルダを再読み込みすると消えてしまう。
FileZilaからパーミッションを確認するも755だったから読めるはず。
試しに777にしてもやっぱりダメだった。

ターミナルからはフォルダを作れる。

ターミナルでpublicフォルダに入ってmkdirしたら普通に作れた。
一度、作成したディレクトリにはFTPソフトからでも転送できた。

とりあえず解決はしたものの理由は分からないまま。

補足

今回は関係なかったが、 .htaccessをどうにかすると治るパターンもあるらしいのでこれでうまくいかなかった人はそれでググってください。

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

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の値をメモします。
image.png

スラッシュコマンドのパラメータの一つとして、Verification Tokenの値がそのまま渡されます。
image.png

自分で作ったアプリケーションは、Basic Informationに表示されているTokenの値と、リクエストで渡ってきたTokenの値が一致するかを調べるだけです。一致するときは、正しいSlackのサーバーからきたと見なすことになります。Verification Tokenの値を秘密にしておく必要があります。

2. Signing Secret

こちらが新しく推奨されているSigning Secretという方法です。

検証手順は以下のとおりです。

  1. Signing SecretをBasic Informationから調べる
  2. リクエストヘッダーのX-Slack-Request-Timestampを取得する
  3. リクエストボディを無加工で取得する
  4. Slackが決めたルールで文字列を結合する
  5. Signing Secretと4で作った文字列から、sha256のハッシュ値をとる
  6. リクエストヘッダーのX-Slack-Signatureで渡ってきた値と比較する
  7. 一致するときは正しいリクエストとみなす

これを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.php
Route::any('/verify-test', 'VerificationController@verify');

config/.env設定

.envにSigning Secretの値を登録する。
HerokuのConfigにセットするのを忘れずに。

.env
SLACK_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 に設定します。

image.png

動作確認

slackのメッセージボックスから/verify-testを呼びます。追加のメッセージは何でも構いません。
image.png

呼びかけに応じて、リプライが来ます。
image.png

だらだらと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にデプロイします。

動作確認

正常動作

前回作った/debugを呼び出ししてみます。
image.png

image.png

無事、middlewareを経由して処理されて、Verificationが正常に終わり、Controllerに処理が伝わりました。middlewareでrequestに追加した3つの値も確認できました。

エラー

ブラウザでGETのリクエストを送ってみると、エラーメッセージが受け取れます。
https://slalack-bot.herokuapp.com/api/debug

{"ok":false,"error":"signature error"}

まとめ

Slack Signing VerificationをLaravelアプリに実装しました。Slackのサーバーから正しく届いたメッセージであることを確認する方法を入れたので、安心感が増しました。

参考資料

https://qiita.com/girlie_mac/items/21fedcc6ce07aa44a670

https://api.slack.com/docs/verifying-requests-from-slack

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

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 mcrypt

MySQL 用コンテナ

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 にあるのか確認すべき箇所がたくさんあって難儀しました。

少しでも参考になれば幸いです。自身は、そのうちまた同じところでつまづきそう。

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

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

以下の画像のような出力結果になります。

laravel-stats.png

オプション

オプション 説明
--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に登録されているクラス
Mail 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.phpcustom_component_classifierに追加することで出力対象が追加されます。

<?php
    ...
    'custom_component_classifier' => [
        \App\Classifiers\RepositoryClassifier::class
    ],
    ...

あとがき

このパッケージをインストールすることでファイルごとの行数やメソッド数、クラス数を分析することでどこが複雑になっているかを手軽に調べることができるようになると思います。

Laravel StatsとPHP Insightsを併せて利用することでよりプロジェクトのコード分析が捗ると思うので一度使用してみてはいかがでしょうか。

参考

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

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.phpassertDatabaseHas でオーバーライドして引数を修正できる

./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"
#     }
# ].
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【laravel5.8】ログイン関連ページ、バリデーションメッセージ、メールの日本語化

php artisan make:authでログイン機能を追加して、$this->middleware('verified');
などでメール認証を追加した。
その際に追加されたログイン関連ページ、バリデーションメッセージ、メールが英語だったので日本語化する。

ログイン関連ページとバリデーションメッセージの日本語化は簡単にできたけど、メールが大変だった。

環境

  • PHP: 7.3.8
  • Laravel: 5.8.35

ログイン関連ページとバリデーションメッセージの日本語化

config/app.phplocalefallback_localeenから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

以上で一通り日本語になっていると思います。
いつか書き直します。

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