20200402のlaravelに関する記事は10件です。

Laravel7.xにVue-Routerを実装してSPAを構築してみる (3)

概要

Laravel側で設定してないURLでリロードすると404エラーページが出てしまう。
image.png

リロードすると…

image.png

リロードすることで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
image.png
例2)localhost:8000/report/report
image.png
→ prefixが設定されているので404エラーが出力される… ここは後で対応してみよう

Vue-Routerでデフォルトラウトを設定

  • Vue-routerに設定されてないラウトが来た場合はIndexページへ遷移されるように設定
resources/js/app.js
const 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'
        },
    ]
});

結果確認

  • localhost:8000/unknown_routeを入力してみる image.png

→ 404エラーページが出力されず、設定したデフォうとページに遷移されたのでOK

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

本日の学習内容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にアクセスするとヒアドキュメント部分が戻り値として返る。

さいごに・・・

サンプルコードを見て、頭で理解はしているが、いざ説明しようとすると時間がかかる。これを続けていると人に説明する時に生きてくる気がする。。。気のせいかな??笑

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

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

再び実行したらできた!

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

laravel6.0でphp artisan migrateコマンドを打つとSQLSTATE[HY000] [1045]エラー

執筆背景

どうも、直人と申します。

現在、自分はlaravelの学習を兼ねて簡単なアプリを作成しようと試みています。

その第一段階として、
昨日VirtualBoxとVagrantを使用してlaravelの開発環境を構築し終えた。

なので、
今日はMVCモデルの学習とMySQL上のデータベースにテーブルを作成し、そこから値を拾ってきて表示するところまでを終わらせよう
と考えていた。

MVCモデルについて一通り学習を終え早速テーブルを作成しようと以下のコマンドを打つ。

$ php artisan make:migration create_books_table

create_books_taqble.phpが作成されるので、ファイル内の以下の部分をデフォルトから変更した。

create_books_taqble.php
 Schema::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ファイルでは#を文字として認識しないため、パスワードに#を使っている人はダブルクォーテーションを使いましょう
というものだった。

私のデータベースのパスワードには見事に#が使われていたため、試しにダブルクォーテーションで括ってテーブルの作成を再実行してみた。

.env
DB_PASSWORD="hoge#"
php artisan migrate
Migration table created successfully.

うまくいった!

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

laravel6.0でphp artisan migrateコマンドを打つとSQLSTATE[HY000] [1045]エラーで苦しんだ人の記録

執筆背景

どうも、直人と申します。

現在、自分はlaravelの学習を兼ねて簡単なアプリを作成しようと試みています。

その第一段階として、
昨日VirtualBoxとVagrantを使用してlaravelの開発環境を構築し終えた。

なので、
今日はMVCモデルの学習とMySQL上のデータベースにテーブルを作成し、そこから値を拾ってきて表示するところまでを終わらせよう
と考えていた。

MVCモデルについて一通り学習を終え早速テーブルを作成しようと以下のコマンドを打つ。

$ php artisan make:migration create_books_table

create_books_taqble.phpが作成されるので、ファイル内の以下の部分をデフォルトから変更した。

create_books_taqble.php
 Schema::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ファイルでは#を文字として認識しないため、パスワードに#を使っている人はダブルクォーテーションを使いましょう
というものだった。

私のデータベースのパスワードには見事に#が使われていたため、試しにダブルクォーテーションで括ってテーブルの作成を再実行してみた。

.env
DB_PASSWORD="hoge#"
php artisan migrate
Migration table created successfully.

うまくいった!

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

laravel5.5で画像アップロード方法

表題の通りです。
画像ファイルをアップロードして、アプリ内で表示させたいと思います。
初心者なりに頑張ってみました。

やりたいこと

プロフィール用の画像をアップロードして、表示させたい。

画像ファイル用DB

今回は既存のusersテーブルにカラムを追加して、ファイルのパスを保存します。

php artisan make:migration add_image_column_users_table --table=image

ルーティング

マイページ内で画像投稿用のフォームに移動したいので、そちらにまとめます。

web.php
Route::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

これだけで良いとのこと。
これで読み出し場所から保存場所を参照出来るようになるそうです。というかなりました。
スクリーンショット 2020-04-02 17.25.55.png
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】画像ファイルアップロードについてのポイントまとめ
本当にありがとうございます。

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

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を返します。

名前付きルートへのURLを生成する - Laravel公式

名前付きルートとは何かというと、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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 になるってことですね!

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

dump()やdd()をグローバルに使えるようにする

Twitterで見かけたこの記事を読んで知ったのですが、その紹介です。

LaravelやSymfonyを使っている方はdumpddを使う機会が結構あると思います。便利ですよね。var_dumpprint_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.php

5: 以上!いつでもどこでもdump ddできるよ!

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

Laravel 5.5 でのパスワードリセット方法

Laravel 5.5パスワードリセットの機能を実装するのに結構苦労したので、
メモとして残させてもらいます。
間違ってるところもあると思いますので、何かあればご指摘いただければ嬉しいです。

やりたい事

laravelでパスワードリセット機能を実装する。
パスワード忘れてログインできない!って時に使うやつ。

migrate

php artisan migrate

認証機能

php artisan make:auth

以上で大半の準備が完了です。
必要なコントローラーはapp/http/controllers/auth/
ビューはresources/views/auth/passwords/
ルーティングにも

web.php
Auth::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=null

laravel/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を利用してるので、だめですね。
スクリーンショット 2020-04-02 0.03.30.png
先ほどの参考サイト様によると、

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

とあります。これを調整すれば良いはず。

…あとはすみませんがまた後日どこかのサーバーにアップロードして動作確認してみます。
そのあと記事を書き直します。
一旦はここまで。中途半端ですみません。

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