質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

6587閲覧

Laravel5.3でパスワードリセットメールをテキスト形式で送りたいのですがどうすればできますか。

qwe001

総合スコア133

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/11/18 06:51

やったこと

composer create-project laravel/laravel hoge --prefer-dist php artisan make:auth

やりたいこと

authで作ったメール本文は標準だと以下のディレクトリにあるファイルが読まれるようですが

vendor/laravel/framework/src/Illuminate/Notifications/resources/views/email.blade.php

これをviewsにある任意のディレクトリから読み込みたいです。

resources/views/admin/emails/password.blade.php

php artisan make:vendor で、
resources/views/vendor/notifications/email.blade.php を読み込むようにできるようですが、
できればそこではなく、自分の指定したディレクトリから読めるようにしたいです。

5.2の時は config/auth.php に書き込んで変更できましたが、5.3ではそれがうまくいきませんでした。

'passwords' => [ 'users' => [ 'email' => ['text' => 'admin.emails.password'], 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, ], ],

以下のURLによると、5.3では sendPasswordResetNotificationメソッドを上書きすればいいとありましたが、具体的に何をすればいいのかがわかりません。

https://readouble.com/laravel/5.3/ja/passwords.html

私の書き方がおかしいだけなのでしょうか…?
皆様どうかお知恵を貸して頂けないでしょうか。

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

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

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

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

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

guest

回答2

0

自己解決

2016/11/30 修正

前回提示した内容で確かにviewは表示されるのですが、トークン情報を持ってこれないので、
TokenMismatchでパスワードのリセットができないという致命的な欠陥を発見しました。
そこで、トークン情報を引き継ぎ、任意のViewをメール本文に表示する方法がわかったので内容を一部変更します。

fagai様
返信ありがとうございます。回答が遅くなり申し訳ありません。
configからサクッとする方法はどうもないようですね。やっぱりオーバーライドするしかないようです。
次のようにすることで、期待通りの結果を得ることが出来ました。ありがとうございました。

(修正前)こちらを参考にしました。というかまんまです。

http://stackoverflow.com/questions/39327954/laravel-5-3-redefine-reset-email-blade-template

(修正後)こちらが大変参考になりました。

http://takayukii.me/post/20160914887

1. Notificationファイルを作成

修正前のものから変更はありません

php artisan make:notification CustomPasswordReset

2. User.phpを修正

修正前のものから変更はありません

app/User.php

php

1 2<?php 3 4namespace App; 5 6use Illuminate\Notifications\Notifiable; 7use Illuminate\Foundation\Auth\User as Authenticatable; 8 9use App\Notifications\CustomPasswordReset; // 追加 10 11class User extends Authenticatable 12{ 13 use Notifiable; 14 15 /** 16 * The attributes that are mass assignable. 17 * 18 * @var array 19 */ 20 protected $fillable = [ 21 'name', 'email', 'password', 22 ]; 23 24 /** 25 * The attributes that should be hidden for arrays. 26 * 27 * @var array 28 */ 29 protected $hidden = [ 30 'password', 'remember_token', 31 ]; 32 33 // ここから下を追加 34 35 public function sendPasswordResetNotification($token) 36 { 37 $this->notify(new CustomPasswordReset($token)); 38 } 39}

3. リセットメールを再定義

修正前のものから内容を全て書き換えています。

app/Notifications/CustomPasswordReset.php

php

1<?php 2 3namespace App\Notifications; 4 5use Illuminate\Bus\Queueable; 6use Illuminate\Notifications\Notification; 7use Illuminate\Contracts\Queue\ShouldQueue; 8use Illuminate\Notifications\Messages\MailMessage; 9 10use Illuminate\Auth\Notifications\ResetPassword; // 追加 11 12class CustomPasswordReset extends ResetPassword // extendsをNotificationからResetPasswordに変更 13{ 14 /** 15 * The password reset token. 16 * 17 * @var string 18 */ 19 public $token; 20 21 /** 22 * Create a notification instance. 23 * 24 * @param string $token 25 * @return void 26 */ 27 public function __construct($token) 28 { 29 $this->token = $token; 30 } 31 32 /** 33 * Get the notification's channels. 34 * 35 * @param mixed $notifiable 36 * @return array|string 37 */ 38 public function via($notifiable) 39 { 40 return ['mail']; 41 } 42 43 /** 44 * Build the mail representation of the notification. 45 * 46 * @param mixed $notifiable 47 * @return \Illuminate\Notifications\Messages\MailMessage 48 */ 49 public function toMail($notifiable) 50 { 51 return (new MailMessage) 52 ->subject('パスワードリセット') // メールの件名 53 ->view('admin.emails.password') // resources/views/admin/emails/password.blade.phpを表示します 54 ->action('Reset Password', url('admin/password/reset', $this->token)); // $actionUrlという変数にトークン情報を含めたパスワードリセットのURLを格納します。これは上記のviewで参照可能です。 55 } 56}

4. リセットメールのViewを作成

touch resources/views/admin/emails/password.blade.php
パスワードを再設定します的な文章を書きます。Doctype宣言やhtmlタグやbodyタグは不要です。 $actionUrlは、次のような内容を表示します。http://example.com/admin/password/reset/32c22536d66d7a994c9430a02a61e4498e86949a08ff39116882570d5385f91c <br /> <a href="{{ $actionUrl }}">{{ $actionUrl }}</a>

5. リセット後のリダイレクト先の設定

リセット完了後のリダイレクト先が通常は /home に飛ぶことになっていますが、これを /admin に飛ぶようにします。

app/Http/Controller/Admin/Auth/ResetPasswordController.php

<?php namespace App\Http\Controllers\Admin\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ResetsPasswords; use Illuminate\Http\Request; class ResetPasswordController extends Controller { /* |-------------------------------------------------------------------------- | Password Reset Controller |-------------------------------------------------------------------------- | | This controller is responsible for handling password reset requests | and uses a simple trait to include this behavior. You're free to | explore this trait and override any methods you wish to tweak. | */ use ResetsPasswords; protected $redirectTo = '/admin'; // 追加 /** * Display the password reset view for the given token. * * If no token is present, display the link request form. * * @param \Illuminate\Http\Request $request * @param string|null $token * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function showResetForm(Request $request, $token = null) { return view('admin.passwords.reset')->with( ['token' => $token, 'email' => $request->email] ); } /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest'); } }

投稿2016/11/25 07:48

編集2016/11/30 02:05
qwe001

総合スコア133

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

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

0

https://github.com/laravel/framework/blob/5.3/src/Illuminate/Foundation/Auth/User.php

https://github.com/laravel/framework/blob/5.3/src/Illuminate/Auth/Passwords/CanResetPassword.php

https://github.com/laravel/framework/blob/5.3/src/Illuminate/Auth/Notifications/ResetPassword.php のtoMailメソッド

https://github.com/laravel/framework/blob/5.3/src/Illuminate/Notifications/Messages/MailMessage.php
にて、標準だとviewメソッドが呼ばれないため標準の情報が返ってきているのだと思います。
そのため、
src/Illuminate/Auth/Notifications/ResetPassword.phpをオーバーライドして、toMailメソッドの内容をお好みに書き変えてしまうと良いと思います。
書き変えたらUser.phpにsendPasswordResetNotificationメソッドを再定義して、オーバーライドしちゃいましょう。

5.3を動かせる環境が手元に無かったので、流れを解説しましたがどうでしょうか・・・?

投稿2016/11/18 09:38

編集2016/11/18 09:39
fagai

総合スコア2158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問