【備忘録】Laravel 6でユーザー認証作る時につまずいたけど解決した方法共有!!
はじめに
こんばんは!
私は、毎週、「1週間1制作計画」っていうのをやっています。
最近は、PHPの勉強を始めたので、今週は、PHP及びLaravelの練習を兼ねてLaravelでアプリケーションを制作してみようと思っていました。
そこで、認証機能をつけようと思い、Laravelに標準装備されている認証機能Authを使ってみようと考え、トライしてみました!!
...すると、めっちゃつまづいた!!
今日の投稿では、そのつまづいた部分について、解決した方法を、認証機能の実装方法と共に記録していきます!
また、その方法自体は最後に記載されている参考資料・文献を参考に実装しました。
まずはLaravel 6をインストールしたい!!
Laravel 6をなぜ選んだかというと、サポート期間が最新のLaravel 8よりも長いためです(LTS = Long-Term-Support)。
一般的なインストール方法
laravel new プロジェクト名
ですよね!
しかし、今回は違います!以下のコードをご覧ください。
composer create-project "laravel/laravel=6.*" プロジェクト名
バージョンを指定して、Laravelをインストールする方法は、上記のように、composerを用います。
アプリケーションの実行には、通常通り、
php artisan serve
を使います。
標準装備Auth使っていきましょう!
それでは、いよいよ標準装備のAuthを使っていきます!
まずは、Auth機能を使うために、laravel/uiというパッケージを導入しましょう。
composer require laravel/ui:^1.0 --dev
上記コードをターミナルに入力して実行すると、認証部分のフロントエンドを制作できるlaravel/uiを導入することができます。
Auth関連のファイルを生成するために、以下の2つをターミナルに記述して実行します。
php artisan ui vue --auth
php artisan migrate
php artisan migrateしたらエラー返ってきた!!
そうです、このphp artisan migrateしたら、以下のようなエラーが返ってきてしまいました。
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations)
at /Users/username/code/LaravelSample/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
660| // If an exception occurs when attempting to run a query, we'll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database's errors.
663| catch (Exception $e) {
> 664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667| }
668|
Exception trace:
1 PDOException::("SQLSTATE[HY000] [2002] Connection refused")
/Users/username/code/LaravelSample/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
2 PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=homestead", "homestead", "secret", [])
/Users/username/code/LaravelSample/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
Please use the argument -v to see more details.
正直、まだデータベースいじってないのに、何なんだ!!
「よくわからん!!調べても、Dockerを利用している人が多くて、自分の開発環境とは違うので参考にならん!!」
って感じでした。
なので、自分の手持ちのテキストに書いてあったように、そのまま以下をターミナルに記述して実行しちゃいました(笑)
npm install && npm run dev
そして、先ほど、アプリケーションを実行した時のように、
php artisan serve
を実行。
アプリケーションを開くことができる状態になります。
http://localhost:8000/
を開いてみてください。
上の画像のようなページが開きます。最初に開いた時と変わらないようにも消えますが、
右上を見て頂くと、きちんと、LOGINとREGISTERと書かれていることがわかります。つまり、きちんと、Auth機能、実装できたんじゃないかと思いますよね!!
これが実は落とし穴...テキストでは触れられていない落とし穴だった。
REGISTER(ユーザー登録)できない!?
まず、初めて利用するので、ユーザー登録をしてみます。
REGISTERを押して、ユーザー登録画面に遷移します。
そして、ユーザー名やメールアドレス、パスワードと言った、登録に必要なデータを入力します。
さぁ、REGISTERボタンを押して、登録だ!
Database name seems incorrect
You're using the default database name laravel. This database does not exist.
Edit the .env file and use the correct database name in the DB_DATABASE key.
なんか出てきた...泣
先ほど、php artisan migrate失敗した時もデータベース関連のエラーが出てきましたね。
今回も同じく、データベース関連のエラーです。データベース名が違うんですって。(incorrect)
次項から、この問題を解決していきます。
まず、データベースに接続しよう!
Laravelプロジェクト作ってから全くいじっていなかったデータベースを、ついにいじっていきます!
MySQLをインストール
MySQLをまずはインストールしましょう。以下をターミナルに記述して実行してください。
brew install mysql
インストールできたら、起動してください。
mysql.server start --skip-grant-tables
上記の方法で起動すると、パスワード不要でした!
その後、ルートユーザーで接続。
mysql -uroot
データベースを作っていきましょう
それでは、続いて、データベースを作っていきます。
最初に、以下のコマンドを記述して、現在のデータベースの様子をチェックします。
mysql> show databases;
ダッシュ(途切れ途切れのあの線)で囲われて、Databaseっていうのが出てきます。出てきたらオッケーです。
次に、新しくデータベースを作成するコマンドを記述して実行してください。
create database sample;
私が、上記でsampleと記述した部分は、みなさんの任意の名前です。
そしてもう一度、show databases;で、データベースの状況を確認します。出力結果に、ここでいう、sampleが含まれていたら問題ないです!
rootユーザーのパスワードの変更
MySQLのrootユーザーのパスワードの変更を行います。
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'secret';
上記を実行してください。
それぞれ、実行直後には、Query OK, なんちゃらとかいうのが返ってきたらOKです!
ここでは、rootユーザーのパスワードを、「secret」に変更しています。
こちらも特に決まりはないので、任意の言葉で。
まぁ、サンプルコードでよく見るのは、secretですね(笑)
この処理が終了すれば、一旦MySQLを終了してから再起動させます。以下のコマンドを入力。
mysql> exit
再起動
mysql.server restart
認証プラグインの変更
ここで、すいません、MySQLをまた違う方法で開きたいので、またまたexitをお願いします。
以下のコマンドでMySQLに接続してください。
mysql -uroot -p
その後、Enter Passwordと言われ、パスワードの入力を求められます。
先ほど、変更したルートユーザーのパスワード、secretを入力してください。
接続できたら、次のコマンドを実行。
SELECT user, host, plugin FROM mysql.user;
SELECT文が出てきたら、ようやくデータベースいじってる感出てきましたねー!
上記コマンドで現状の認証プラグインを調べることができます。
おそらく、caching_sha2_passwordとなっているかと思います。
今回は、mysql_native_passwordを使いたいので、変更しましょう。以下のコマンドを実行してください。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret';
それでは、再度、以下のコマンドで確認してみましょう。
SELECT user, host, plugin FROM mysql.user;
root項目のプラグインが、caching_sha2_passwordだったのに、mysql_native_passwordに変更されているかと思います。
あと少し!.envファイルの編集をしよう!
一旦、ターミナルからは離れて、エディタに移動してください。
作成したプロジェクトのフォルダ内に、「.env」という名前のファイルがあると思います。そのファイルを開きましょう。
※examapleがついている.envファイルは違います!!今回編集するのは、ただの.envファイルです!
開いたらなんだかデータベースに関連しそうな内容がたくさん書かれています。
その中でも、以下のコメントアウトした部分を変更します。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel // ココ変更するよ!
DB_USERNAME=root
DB_PASSWORD= // ココ変更するよ!
まず、DB_DATABASE=laravelの、laravelの部分を、sampleにします。
このsampleは、新しくデータベースを作った時に使った名前です。
DB_PASSWORD= は、元々空欄になっていますが、rootユーザーのパスワードとして設定した、secretを空欄部分に入れます。
最終的には、以下のような状態になるかと思います。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=root
DB_PASSWORD=secret
編集後、またターミナルに帰りましょう。
キャッシュの削除を行います。
php artisan config:cache
最初できなかったphp artisan migrateしてみる!
この時点で、
php artisan migrate
してみると、成功します。
REGISTERリベンジ!
もう一度、Laravelアプリケーションを実行してみましょう。
php artisan serve
ですね。
そしてもう一度、REGISTERに挑戦してみてください!!
すると、エラーは特に出ず、登録できるようになっています!!
まとめ
長くなりましたが、数時間かけて格闘していたので、備忘録としてまとめてみました!
ここまでお読みくださり、ありがとうございました。
理解不足等による不備があれば、コメントお願い致します。
参考資料・文献
【Laravel】MySQLの接続方法を徹底解説【コピペでOK】
更新!!Laravel6/7 (laravel/ui)でのLogin機能の実装方法〜MyMemo
【Laravel】Laravelでバージョンを指定してインストールする方法
掌田津耶乃著『PHPフレームワーク Laravel入門 第2版』(2020)
Author And Source
この問題について(【備忘録】Laravel 6でユーザー認証作る時につまずいたけど解決した方法共有!!), 我々は、より多くの情報をここで見つけました https://qiita.com/azu_nyan/items/533bb0633b64763480a1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .