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

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

ただいまの
回答率

90.04%

Laravel5.4 認証のパスワード再設定にて、メールアドレスを取得したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,831
退会済みユーザー

退会済みユーザー

プログラミング初心者です。
laravel5.4 パスワード再設定のメールのリンク先にてリクエストしたメールアドレスを取得したいと思っています。
行った内容では$emailがNULLになってしまい表示ができていません。
原因または解決策をご存知の方はいらっしゃいませんでしょうか。

私の行った手順は以下です。

(1)  php artisan make:auth  をし、php artisan migrateを実行。

(2)作成された  /app/Http/Controllers/Auth/ResetPasswordController  のtrait先である  /vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords のshowResetFormメソッドを確認し、emailとtokenを取得しているかを確認する

public function showResetForm(Request $request, $token = null)
{
    return view('auth.passwords.reset')->with(
        ['token' => $token, 'email' => $request->email]
    );
}

(3)送られてくるメールの内容を変更したかったので参考資料をもとに、内容を変更。

参考URL:https://teratail.com/questions/55669

 1. Notificationファイルを作成 
 php artisan make:notification UserResetPassword 

 2 User.phpを修正 
 app/User.php 

public function sendPasswordResetNotification($token)
    {
        $this->notify(new UserResetPassword($token));
    }

 3. リセットメールを再定義 
 /app/Notifications/UserResetPassword.php 

<?php

        namespace App\Notifications;

        use Illuminate\Bus\Queueable;
        use Illuminate\Notifications\Notification;
        use Illuminate\Contracts\Queue\ShouldQueue;
        use Illuminate\Notifications\Messages\MailMessage;
        use Illuminate\Auth\Notifications\ResetPassword;   //追加

        class UserResetPassword extends ResetPassword
        {
            /**
             * The password reset token.
             *
             * @var string
             */
            public $token;


            /**
             * Create a notification instance.
             *
             * @param  string  $token
             * @return void
             */
            public function __construct($token)
            {
                $this->token = $token;
            }

            /**
             * Get the notification's channels.
             *
             * @param  mixed  $notifiable
             * @return array|string
             */
            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)
                    ->subject('パスワード再設定のご案内') 
                    ->view('auth.passwords.email_text')
                    ->action('Reset Password', url('password/reset', $this->token));
            }

            /**
             * Get the array representation of the notification.
             *
             * @param  mixed  $notifiable
             * @return array
             */
            public function toArray($notifiable)
            {
                return [
                    //
                ];
            }
        }

    4. リセットメールのViewを作成 
      touch /resources/views/users/auth/passwords/email_text.blade.php 

<a href="{{ $actionUrl }}">{{ $actionUrl }}</a>

   

 (4)  リセットメール受信することを確認。 
    メールの内容
    http://example.jp:8000/admin/password/reset/d3e956530e9902b39994d246b8b55eb90fe83316aea53a8350f06b5f318052bb

(5) make:auth で作成されるViewのメールアドレスは入力フォームがあるので変更する。 
    /resources/views/auth/passwords/reset.blade.php 

<tr>
<th style="width: 150px;" class="t_right">メールアドレス</th>
<td>
{{ $email }}
</td>
</tr>

するとメールアドレスが表示されない状態になりました。
$emailの値をvar_dump()にて表示させてもNULLになっています。

試したこと

Laravel5.3より、Authが変更したということでLaravel5.2のshowResetformメソッドを  /app/Http/Controllers/Auth/ResetPasswordController.php  にてオーバーライドする。

$resetView = 'auth.passwords.reset';

public function showResetForm(Request $request, $token = null)
{
if (is_null($token)) {
return $this->getEmail();
}

$email = $request->input('email');

if (property_exists($this, 'resetView')) {
return view($this->resetView)->with(compact('token', 'email'));
}

if (view()->exists('auth.passwords.reset')) {
return view('auth.passwords.reset')->with(compact('token', 'email'));
}

return view('auth.reset')->with(compact('token', 'email'));
}


上記内容でもメールアドレスは表示されませんでした。
宜しくお願い致します。

補足情報

OS:macOS Sierra Version 10.12.4
メモリ:8 GB 1600 MHz DDR3 
php 7.0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

+1

自己解決できました。

(3)送られてくるメールの内容を変更したかったので参考資料をもとに、内容を変更。

にてemailを渡していなかったのが原因でした。

2 User.phpを修正  
 app/User.php 

public function sendPasswordResetNotification($token)
    {
        $this->notify(new UserResetPassword($token,$this->email)); //$this->emailを追加
    }


3. リセットメールを再定義  
 /app/Notifications/UserResetPassword.php 

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Auth\Notifications\ResetPassword;

class UserResetPassword extends ResetPassword
{
    /**
     * The password reset token.
     *
     * @var string
     */
    public $token;
    private $email;


    /**
     * Create a notification instance.
     *
     * @param  string  $token
     * @return void
     */
    public function __construct($token,$email)  
    {                                      //↑$emailを追加
        parent::__construct($token);
        $this->email = $email; //追加

    }

    /**
     * Get the notification's channels.
     *
     * @param  mixed  $notifiable
     * @return array|string
     */
    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)
            ->subject('パスワード再設定のご案内')
            ->view('auth.passwords.email_text')
            ->action('Reset Password', url('password/reset/'.$this->token.'?email='.$this->email)); // '?email='.$this->emailを追加
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}


  /resources/views/auth/passwords/reset.blade.php   はそのままで無事に参照できました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる