- 投稿日:2020-04-02T23:53:29+09:00
Laravel7.xにVue-Routerを実装してSPAを構築してみる (3)
概要
Laravel側で設定してないURLでリロードすると404エラーページが出てしまう。
リロードすると…
リロードすることでVue-Routerで設定したラウトのページへ飛ぶようにしてみる
詳細
Laravel側のラウト設定
- ラウトしていないURLもIndexページへ遷移するようにコードを追加
- URL情報をパラメータとしてVue-Routerに渡せるように設定
routes/web.php// Route::get('/', function () { // return view('welcome'); // }); Route::get('/{extraUrl?}', function ($extraUrl = null) { return view('welcome', [ 'extraUrl' => $extraUrl ]); });上の処理でprefix(サブディレクトリ)がないURLはIndexページへ遷移することが可能
例1)localhost:8000/report
例2)localhost:8000/report/report
→ prefixが設定されているので404エラーが出力される… ここは後で対応してみようVue-Routerでデフォルトラウトを設定
- Vue-routerに設定されてないラウトが来た場合はIndexページへ遷移されるように設定
resources/js/app.jsconst router = new VueRouter({ mode: 'history', routes: [ // Indexページ { path: '/report', name: 'report-page', component: ReportPage }, // フォームページ { path: '/form', name: 'form-page', component: FormPage }, // デフォルトページ;Indexページ { path: '*', redirect: '/report' }, ] });結果確認
→ 404エラーページが出力されず、設定したデフォうとページに遷移されたのでOK
- 投稿日:2020-04-02T23:25:21+09:00
本日の学習内容part6
はじめに
こんにちは。閲覧頂きありがとうございます。okayamanです。
今回からPHPフレームワークLarabel入門第2版の学習した内容をアウトプットしていきますのでよろしくお願いします。(もし、間違っている箇所があれば教えて下さい。ものすごく助かります。)ちなみにこの学習内容はLaravel 6、PHP 7で行っております。~P38まで終了
ルーティングの基本->Route::get()
ルーティングとはあるアドレスにアクセスしたとき、どの処理を呼び出し実行するかを管理するもの。
Route::の後に来る単語や()内の記述によって処理が変わる。ここではRoute::getを取り上げる。Route::get('hi', function() { return '<html><body><h1>Hi</h1><p>test page</p></body></html>'; });上記のコードは第1引数がアドレス、第2引数が関数になっており
http://localhost:8000/hi
にアクセスするとhtmlタグに囲まれた部分が戻り値となる。ヒアドキュメント
PHPで長い文章を記述するのに使われる。<<<演算子を使って、リスト内に記述されたテキストを変数に代入できる。
<?php $test = <<<EOF <html> <head> <title>Hey!!</title> <style> body {font-size:30px; color:black;} h1 {font-size:60px; text-align:center; color:blue;} </style> </head> <body> <h1>こんにちは</h1> <p>テストテスト</p> </body> </html> EOF; echo $test; ?>$testを出力するだけで上記のHTMLが表示される。
上記の2つを組み合わせると・・・
<?php $test = <<<EOF <html> <head> <title>Hey!!</title> <style> body {font-size:30px; color:black;} h1 {font-size:60px; text-align:center; color:blue;} </style> </head> <body> <h1>こんにちは</h1> <p>テストテスト</p> </body> </html> EOF; Route::get('hey', function() use ($test) { return $test; });
http://localhost:8000/hey
にアクセスするとヒアドキュメント部分が戻り値として返る。さいごに・・・
サンプルコードを見て、頭で理解はしているが、いざ説明しようとすると時間がかかる。これを続けていると人に説明する時に生きてくる気がする。。。気のせいかな??笑
- 投稿日:2020-04-02T21:54:13+09:00
vagrant upが実行できない → ディレクトリが違うだけだった
vagrant upが実行できない
A Vagrant environment or target machine is required to run this command. Run `vagrant init` to create a new Vagrant environment. Or, get an ID of a target machine from `vagrant global-status` to run this command on. A final option is to change to a directory with a Vagrantfile and to try again.$ vagrant up を実行しようとすると、上記のエラー文が表示されて実行できない。。。
ホームディレクトリじゃん。
Homesteadディレクトリに移動して
cd Homestead再び実行したらできた!
- 投稿日:2020-04-02T18:53:10+09:00
laravel6.0でphp artisan migrateコマンドを打つとSQLSTATE[HY000] [1045]エラー
執筆背景
どうも、直人と申します。
現在、自分はlaravelの学習を兼ねて簡単なアプリを作成しようと試みています。
その第一段階として、
昨日VirtualBoxとVagrantを使用してlaravelの開発環境を構築し終えた。なので、
今日はMVCモデルの学習とMySQL上のデータベースにテーブルを作成し、そこから値を拾ってきて表示するところまでを終わらせよう
と考えていた。MVCモデルについて一通り学習を終え早速テーブルを作成しようと以下のコマンドを打つ。
$ php artisan make:migration create_books_tablecreate_books_taqble.phpが作成されるので、ファイル内の以下の部分をデフォルトから変更した。
create_books_taqble.phpSchema::create('books', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('image'); $table->string('author'); $table->string('local'); $table->timestamps(); });その後、テーブルを作成しようと
$ php artisan migrateコマンドを実行すると、以下のエラーが発生した。
Illuminate\Database\QueryException SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = Homestead and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:670 666| // If an exception occurs when attempting to run a query, we'll format the error 667| // message to include the bindings with SQL, which will make this exception a 668| // lot more helpful to the developer instead of just the database's errors. 669| catch (Exception $e) { > 670| throw new QueryException( 671| $query, $this->prepareBindings($bindings), $e 672| ); 673| } 674| +34 vendor frames 35 artisan:37 Illuminate\Foundation\Console\Kernel::handle()何故かアクセスが拒否された。
これについての対処方法を以下で述べる。結論
laravel5.8以降の.envファイル(データベースにアクセスするためのパスワードとか設定されてる)では、
#を文字として認識しない仕様であり、私が設定していたパスワードには#が使われていたため、パスワードをダブルクォーテーションで括ることでmigrateすることができた。作業内容
以下では、実際の作業内容を綴っていきます。
PHPのバージョンの違いを疑う
ホスト側のPHPとゲスト側のPHPのバージョンが異なるために不具合が生じているのではないかと考え両者のバージョンを確認してみると異なることを確認した。
#ホスト側 $ php -v PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies#ゲスト側 $ php -v PHP 7.4.4 (cli) (built: Mar 19 2020 20:12:35) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.4, Copyright (c), by Zend Technologiesそのため、ホスト側のPHPのバージョンをアップグレードすることにした。
具体的には、brewでインストールしたのち、パスを通して再起動するということを行なっている。$ brew install php@7.4 $ echo 'export PATH="/usr/local/opt/php@7.4/bin:$PATH"' >> ~/.bash_profile $ echo 'export PATH="/usr/local/opt/php@7.4/sbin:$PATH"' >> ~/.bash_profile $ brew services start php結果、直らなかった…。
デフォルトで作成されるrootユーザを疑う
$ mysql -u root -p上記の方法であれば、mysqlに接続することができた(パスワードは.envファイルに記載されているものと同じ)。
mysql -u root -pで入力したユーザ名とパスワードは.envファイルに記載されていた同じなのに、何故php artisan migrateコマンドからではアクセスが拒否されたのか
ということに着目し調べてみることにした。mysqlからuserの一覧を表示すると、デフォルトで作成されたと思われるroot@0.0.0.0ユーザと自分で作ったroot@localhostの二種類が存在することが判明。
これが原因ではないかと思い、デフォルトで作成されているroot@0.0.0.0ユーザを削除してみることにした。
#変更前 mysql> SELECT Host, User FROM mysql.user; +-----------+------------------+ | Host | User | +-----------+------------------+ | 0.0.0.0 | root | | localhost | root | +-----------+------------------+#変更後 mysql> drop user root@0.0.0.0; Query OK, 0 rows affected (0.00 sec) mysql> SELECT Host, User FROM mysql.user; +-----------+------------------+ | Host | User | +-----------+------------------+ | localhost | root | +-----------+------------------+しかしながら直らなかった…。
laravel本体を疑う
さらに色々深く調べてみると以下の記事を発見。
→ https://qiita.com/kotatsu0715/items/a8d3a93c4a46ca925fc4要約すると、
laravel5.8以降の.envファイルでは#を文字として認識しないため、パスワードに#を使っている人はダブルクォーテーションを使いましょう
というものだった。私のデータベースのパスワードには見事に#が使われていたため、試しにダブルクォーテーションで括ってテーブルの作成を再実行してみた。
.envDB_PASSWORD="hoge#"php artisan migrate Migration table created successfully.うまくいった!
- 投稿日:2020-04-02T18:53:10+09:00
laravel6.0でphp artisan migrateコマンドを打つとSQLSTATE[HY000] [1045]エラーで苦しんだ人の記録
執筆背景
どうも、直人と申します。
現在、自分はlaravelの学習を兼ねて簡単なアプリを作成しようと試みています。
その第一段階として、
昨日VirtualBoxとVagrantを使用してlaravelの開発環境を構築し終えた。なので、
今日はMVCモデルの学習とMySQL上のデータベースにテーブルを作成し、そこから値を拾ってきて表示するところまでを終わらせよう
と考えていた。MVCモデルについて一通り学習を終え早速テーブルを作成しようと以下のコマンドを打つ。
$ php artisan make:migration create_books_tablecreate_books_taqble.phpが作成されるので、ファイル内の以下の部分をデフォルトから変更した。
create_books_taqble.phpSchema::create('books', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('image'); $table->string('author'); $table->string('local'); $table->timestamps(); });その後、テーブルを作成しようと
$ php artisan migrateコマンドを実行すると、以下のエラーが発生した。
Illuminate\Database\QueryException SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = Homestead and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:670 666| // If an exception occurs when attempting to run a query, we'll format the error 667| // message to include the bindings with SQL, which will make this exception a 668| // lot more helpful to the developer instead of just the database's errors. 669| catch (Exception $e) { > 670| throw new QueryException( 671| $query, $this->prepareBindings($bindings), $e 672| ); 673| } 674| +34 vendor frames 35 artisan:37 Illuminate\Foundation\Console\Kernel::handle()何故かアクセスが拒否された。
これについての対処方法を以下で述べる。結論
laravel5.8以降の.envファイル(データベースにアクセスするためのパスワードとか設定されてる)では、
#を文字として認識しない仕様であり、私が設定していたパスワードには#が使われていたため、パスワードをダブルクォーテーションで括ることでmigrateすることができた。作業内容
以下では、実際の作業内容を綴っていきます。
PHPのバージョンの違いを疑う
ホスト側のPHPとゲスト側のPHPのバージョンが異なるために不具合が生じているのではないかと考え両者のバージョンを確認してみると異なることを確認した。
#ホスト側 $ php -v PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies#ゲスト側 $ php -v PHP 7.4.4 (cli) (built: Mar 19 2020 20:12:35) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.4, Copyright (c), by Zend Technologiesそのため、ホスト側のPHPのバージョンをアップグレードすることにした。
具体的には、brewでインストールしたのち、パスを通して再起動するということを行なっている。$ brew install php@7.4 $ echo 'export PATH="/usr/local/opt/php@7.4/bin:$PATH"' >> ~/.bash_profile $ echo 'export PATH="/usr/local/opt/php@7.4/sbin:$PATH"' >> ~/.bash_profile $ brew services start php結果、直らなかった…。
デフォルトで作成されるrootユーザを疑う
$ mysql -u root -p上記の方法であれば、mysqlに接続することができた(パスワードは.envファイルに記載されているものと同じ)。
mysql -u root -pで入力したユーザ名とパスワードは.envファイルに記載されていた同じなのに、何故php artisan migrateコマンドからではアクセスが拒否されたのか
ということに着目し調べてみることにした。mysqlからuserの一覧を表示すると、デフォルトで作成されたと思われるroot@0.0.0.0ユーザと自分で作ったroot@localhostの二種類が存在することが判明。
これが原因ではないかと思い、デフォルトで作成されているroot@0.0.0.0ユーザを削除してみることにした。
#変更前 mysql> SELECT Host, User FROM mysql.user; +-----------+------------------+ | Host | User | +-----------+------------------+ | 0.0.0.0 | root | | localhost | root | +-----------+------------------+#変更後 mysql> drop user root@0.0.0.0; Query OK, 0 rows affected (0.00 sec) mysql> SELECT Host, User FROM mysql.user; +-----------+------------------+ | Host | User | +-----------+------------------+ | localhost | root | +-----------+------------------+しかしながら直らなかった…。
laravel本体を疑う
さらに色々深く調べてみると以下の記事を発見。
→ https://qiita.com/kotatsu0715/items/a8d3a93c4a46ca925fc4要約すると、
laravel5.8以降の.envファイルでは#を文字として認識しないため、パスワードに#を使っている人はダブルクォーテーションを使いましょう
というものだった。私のデータベースのパスワードには見事に#が使われていたため、試しにダブルクォーテーションで括ってテーブルの作成を再実行してみた。
.envDB_PASSWORD="hoge#"php artisan migrate Migration table created successfully.うまくいった!
- 投稿日:2020-04-02T17:56:24+09:00
laravel5.5で画像アップロード方法
表題の通りです。
画像ファイルをアップロードして、アプリ内で表示させたいと思います。
初心者なりに頑張ってみました。やりたいこと
プロフィール用の画像をアップロードして、表示させたい。
画像ファイル用DB
今回は既存のusersテーブルにカラムを追加して、ファイルのパスを保存します。
php artisan make:migration add_image_column_users_table --table=imageルーティング
マイページ内で画像投稿用のフォームに移動したいので、そちらにまとめます。
web.phpRoute::group(['middleware' => ['auth']],function() { //画像投稿フォーム表示 Route::get('userimage', 'UserEditController@index')->name('image.index'); //画像保存 Route::post('userimage', 'UserEditController@upload')->name('image.upload');コントローラー
アップロード用のコントローラーを作成したいと思います。
UserEditController.php//画像アップロード画面を表示 public function index() { return view('edit.user_image'); }UserEditController.php//画像アップロードされた画像を保存 public function upload(Request $request) { //バリデーション $this->validate($request,[ 'userimage' => 'required|image' ]); if($request->isMethod('POST')) { $path = $request->file('userimage')->store('public/img'); $image = User::find(\Auth::id()); $image->image = basename($path); //imageカラムに保存 $image->save(); return back()->with(['success' => 'ファイルを保存しました']); } }上のコードでは
storage/app/public/img/
内にアップロードした画像が保存されます。メソッドをすぐ忘れるのでメモ。
store()
は一意のファイル名を自動で生成してくれる。
isMethd
は公式サイト様よりリクエストメソッドの取得
また、isMethodメソッドを使えば、指定した文字列とHTTP動詞が一致するかを調べることができます。これでなくても、
if ($request->hasFile('image')) //hasFile()内はinput type の name属性でも良さそう。
basename
はファイルパスを除いてファイル名のみを取り出してくれる。ビュー
アップロードされた画像の保存場所と読み出し場所が違うそうです。
保存場所はstorage/app/public/
読み出し場所はpublic/storage/
なのでシンボリックリンクを設定します。ショートカットみたいな物らしい。php artisan storage:linkこれだけで良いとのこと。
これで読み出し場所から保存場所を参照出来るようになるそうです。というかなりました。
AWSのcloud9上では、こんなのができてました。
ちなみに、上のコードではstorage/app/public/img/
内にアップロードした画像が保存されます。画像の読み出しは、
<img src="{{ asset('/storage/img/' . \Auth::user()->image) }}">はこんな感じで読み出し。ってかこのやり方で良いのか...?
asset()
はファイルまでのフルパスを生成してくれるそうです。
これはhttps通信する時にややこしいみたい。一旦勉強はまた別の機会に。困ったこと
最初コードを組んで、なんでも良いから画像を、とのことでスクリーンショットをアップロードしようとしたところ、エラーが。
The userimage failed to upload.めっちゃアバウトなエラーで困る。
dd($request->file('userimage'));
ってしてもfalseってなる。何しても分からなくて困ってたのですが、
phpinfo();
して確認したら、PHPのファイル制限が2MBまでなんですね。知らなかった。
画像サイズ確認したら案の定超えてました。
覚えておきます。非常に勉強になりました。
ここまで読んで頂いてありがとうございました。こちらのサイト様を参考にさせていただきました。
Laravelで画像ファイルをアップロードするサンプル
画像アップロード(基本)
Laravelで画像をアップロードする方法
[Laravel] ユーザーのアイコン画像を投稿、表示させる機能の実装したのでメモ(画像の保存場所は?シンボリックリンクって?)
Laravelで画像ファイルを保存したい
【Laravel5.6】画像ファイルアップロードについてのポイントまとめ
本当にありがとうございます。
- 投稿日:2020-04-02T14:44:38+09:00
techpitで学んだことをここに綴る
Laravel:ルーティングの一覧を表示するコマンド
ルーティングの一覧を表示するコマンド$ docker-compose exec workspace php artisan route:list+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | | GET|HEAD | / | | App\Http\Controllers\ArticleController@index | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | GET|HEAD | password/confirm | password.confirm | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm | web,auth | | | POST | password/confirm | | App\Http\Controllers\Auth\ConfirmPasswordController@confirm | web,auth | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web | | | POST | password/reset | password.update | App\Http\Controllers\Auth\ResetPasswordController@reset | web | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | +--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+Laravel:route関数
与えられた名前付きルートのURLを返します。
名前付きルートとは何かというと、2章のパート2でphp artisan route:listによって表示された表の、Name列に値のあるルートのことです。
@ csrf
HTMLに変換されると以下な感じ
<input type="hidden" name="_token" value="xwwDXDKEEnPoCZMF2xMWDtCbpeQgCSNNVIINugCA">valueの値は毎回変わります。
csrfは、Cross-Site Request Forgeries(クロスサイト・リクエスト・フォージェリ)というWebアプリケーションの脆弱性の略称old関数
old関数は、引数にパラメータ名を渡すと、直前のリクエストのパラメータを返します。
$errors変数
Laravelでは、Bladeの中で$errors変数を使えます。
$errors変数は、Illuminate\Support\MessageBagクラスのインスタンスであり、バリデーションエラーメッセージを配列で持っています。以下のコードでは、MessageBagクラスのanyメソッドを使っていますが、これはエラーメッセージの有無を返します。
tinker
tinkerは、Laravelに用意された機能のひとつで、コマンドラインでPHPのコードを実行できます。
remember meトークン
<input type="hidden" name="remember" id="remember" value="on">上記のinputタグは、世の中のWebサービスのログイン画面によく登場する、
- 次回から自動でログインする
という説明がされたチェックボックスに相当するものとなります。
ただし、type属性をcheckboxではなくhiddenとすることでユーザーが直接操作できない隠し項目とし、value属性をonとすることで常にチェックが入ったのと同じ状態にしています。docker起動
$ docker-compose up -d workspace nginx php-fpm postgres mailhogトランスパイルの実行
docker-compose exec workspace npm run watch-poll
- 投稿日:2020-04-02T13:55:26+09:00
LaravelでDBに入っている値がURL文字列かどうか調べる
URLかどうかなんてDBに入れる前にフォームバリデーションで調べれば良いような気はしますが、それだとお客さんの要件にかなわないこともあるのです。つらい。
鬼の正規表現で調べても良いのですけど、そもそもLaravelにはURL文字列かどうか調べる機能はあるし、自力で鬼の正規表現を書くよりイケてる判定ができそうな気がするので、そいつを利用させてもらいたいものです。
基本的にバリデーションはRequestクラスをベースにしたRequestに面倒見させて、Controller側ではそいつをDIするってのが筋の良い書き方だとは思うのですが、そうじゃない使い方もできます。
Validatorインスタンスをmakeしようぜ
ちょっと長いのですが、実はこんな感じにするとValidatorは作れるのです。
// なんかDBのデータ取ってくる。こいつはurlというvarcharのカラムを持っていることとする。 $hoge_model = HogeModel::find($id); // Validator::makeの第一引数は配列しか受けられないのでtoArrayしておく $validator = Validator::make($hoge_model->toArray(), [ 'url' => 'url' ]);こんな感じにするとValidatorインスタンスを作ることができます。
第2引数は君らの好きなバリデーションルールです。あとは
$validator->fails()でバリデーションがしくじってたら
true
が返ってきます。つまりちゃんとURL文字列であればfalse
になるってことですね!
- 投稿日:2020-04-02T00:30:42+09:00
dump()やdd()をグローバルに使えるようにする
Twitterで見かけたこの記事を読んで知ったのですが、その紹介です。
LaravelやSymfonyを使っている方は
dump
やdd
を使う機会が結構あると思います。便利ですよね。var_dump
?print_r
?なにそれおいしryしかしLaravelやSymfonyの外でやろうとするとちょっと面倒です。これだけのためにわざわざ
symfony/var-dumper
をrequireすることもしばしば。しかしもう必要ありません。めっちゃシンプルに常に(psyshコンソールの中でも!)この機能をプリロードする方法を見つけました。 (元記事の方が)PHPにビルトインされているauto_prepend_fileオプションを使います。
なお、元記事の著者はAlgoliaの中の人のようですが、この方法を1年以上使っていて特に問題は起こっていないとのこと。("function already defined"とか)
手順
1: 適当なところにディレクトリを作る (
dotfiles/
の下とか?)2: そのディレクトリの中で
composer require symfony/var-dumper
3:
prepend.php
などの適当なファイルを作るprepend.php<?php require_once 'vendor/autoload.php';4:
php.ini
の以下の箇所に絶対パスを追加; Automatically add files before PHP document. ; http://php.net/auto-prepend-file auto_prepend_file = /absolute/path/to/your/prepend.php5: 以上!いつでもどこでも
dump
dd
できるよ!
- 投稿日:2020-04-02T00:21:48+09:00
Laravel 5.5 でのパスワードリセット方法
Laravel 5.5パスワードリセットの機能を実装するのに結構苦労したので、
メモとして残させてもらいます。
間違ってるところもあると思いますので、何かあればご指摘いただければ嬉しいです。やりたい事
laravelでパスワードリセット機能を実装する。
パスワード忘れてログインできない!って時に使うやつ。migrate
php artisan migrate認証機能
php artisan make:auth以上で大半の準備が完了です。
必要なコントローラーはapp/http/controllers/auth/
ビューはresources/views/auth/passwords/
ルーティングにもweb.phpAuth::routes() Route::get('/home', 'HomeController@index')->name('home');みたいなのが追加されます。
mailableクラス作成
php artisan make:mail ResetPasswordMail作成されたのは
app/Mail/
以下にあります。パスワードリセットのルーティング本体
vendor/laravel/framework/src/Illuminate/Routing/Router.php// Password Reset Routes... $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request'); $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email'); $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset'); $this->post('password/reset', 'Auth\ResetPasswordController@reset');1131行目ぐらいに書いてます。これをそのまま利用すればmake::auth しなくても良いのかも?
環境設定
.envファイルの中のメール送信設定を変更します。
MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=nulllaravel/config/mail.php
にドライバの設定がありますが、envファイル変更してたら大丈夫?
メールの送信元を設定できますが、デフォルトでは無いため、直接記述します。
一旦はこんな感じに。MAIL_FROM_ADDRESS=passreset@laraveltest.com MAIL_FROM_NAME=Laravelerあとはこちらのサイト様を思いっきり参考にさせて頂いて、メール設定をしました。
https://www.ritolab.com/entry/38
テスト用メールの中身を確認しながら作成していきます。メール送信
今回はGmailを使ってみます。
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=xxxxxxxxxxx@gmail.com MAIL_PASSWORD=xxxxxxxxxxxxxxxx MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=notif@laravelmailsender.com MAIL_FROM_NAME=LaravelMailSenderこの「MAIL_PASSWORD」ですが、実際にGmailを利用してメール送信するなら、アカウントにログインさせた状態にしないといけないって事なので、
・Gmailの2段階認証を設定
・アプリ固有パスワードを取得
・アプリ固有パスワードを上記の「MAIL_PASSWORD」に記述
して設定します。
送信元になるgmailのメールアドレスは見えてしまうので、専用のgmailアカウントを取得するのも手かと思います。こちらを思いっきり参考にさせていただきました。
https://qiita.com/zaburo/items/37f28f0b621cbac74d15
https://qiita.com/t-kuni/items/aa906cd07e54037a5eafあとあまり必要ないかもしれませんが一応。
パスワードリセットが成功した時のリダイレクト先は
Controllers/Auth/ResetPasswordController.php
の中を調整すれば良いとのこと。メールで送られてきたリンクの調整
Gmailからリンク付きでメールが送信されてきました。
ですが、リンクを踏んだらなぜかlocalhostにアクセスしようとしてる。
現在、某プログラミングスクールでAWSのcloud9を利用してるので、だめですね。
先ほどの参考サイト様によると、ResetPassword.php->action(Lang::getFromJson('Reset Password'), url(config('app.url').route('password.reset', $this->token, false))) ->line(Lang::getFromJson('If you did not request a password reset, no further action is required.'));のところに
config('app.url')
と書いてます。
ここかなぁ・・・.env
ファイルの上の方に、APP_URL=http://localhostとあります。これを調整すれば良いはず。
…あとはすみませんがまた後日どこかのサーバーにアップロードして動作確認してみます。
そのあと記事を書き直します。
一旦はここまで。中途半端ですみません。