- 投稿日:2020-07-22T16:14:31+09:00
Laravel artisanコマンドメモ
Laravel artisanについて忘れないようにメモ
PHPのLarabelコマンド
artisanはアルチザンと読むらしい。コマンド一覧
php artisan listヘルプを表示
php artisan make:controller -hルートの確認
php artisan route:listモデルの作成
php artisan make:model Adminマイグレーションの作成
php artisan make:migration create_admins_table --create=admins※マイグレーションとは
古いやつに入っているデータとかプログラムとかを新しいやつに移すこと基本的なキャッシュクリアコマンド
- APIなど、Webサービスを使っていなくてビューがないのであれば、 view:clear はしなくてよい。
php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clearちょっと踏み込んだキャッシュクリアコマンド
- オートローディングをしなおして、オプティマイズも実行してと、まるっとキャッシュを作り直したい場合。
composer dump-autoload php artisan clear-compiled php artisan optimize php artisan config:cacheキーの作り直し
- 新しくキーを作り直して、完全に前のキャッシュを無効にするときとか。
php artisan key:generateScheduler
Schedulerのキャッシュは、前述のコマンドを持ってしても消えてくれないという、ロックな仕様。
次のようなキャッシュファイルを明示的に消す。$ pwd /path/to/your/laravel/storage/framework $ ls -l schedule-* -rw-r--r-- 1 apache apache 0 Jun 8 18:02 schedule-0d894ecd1e342cc720e1556766671673 -rw-r--r-- 1 apache apache 0 Jun 6 12:09 schedule-c4b93c084c29f9c504d4f412f1540947 $ rm -f schedule-*コマンドのヘルプを表示する(help)
php artisan help (コマンド)artisanコマンドの使い方を確認します。例えば、「down」コマンドを実行するにはこうなります。
php artisan help downただし、以下のように「-h」をつけることでも同じ内容を表示することができます。もしかすると、こちらの方が直感的に使えるかもしれません。
php artisan down -h
- 投稿日:2020-07-22T14:53:26+09:00
【Vagrant】Laravel homesteadでVagrantUpができない。
- 投稿日:2020-07-22T14:43:30+09:00
【Laravel】クエリビルダ
クエリビルダ
これを使うとメソッドチェーンでDBアクセスができる
クエリビルダとは
PHPで書いてるのにSQLクエリという別言語で書いていくのってなんか違くない?
ということで用意されたのがクエリビルダメソッドを呼び出していくだけでDBアクセスができる。
DB::tableとget
テーブルの全レコードを取得
public function index(Request $request) { $items=DB::table('people')->get(); return view('hello.index', ['items'=>$items]); }DB::table
$変数=DB::table('テーブル名');get
取得するフィールドを特定する場合は引数を利用する
例えばget['id','name']
とすればidとnameフィールドだけを取り出せる。
省略すると全フィールドを取得戻り値は各レコードの値をオブジェクトにまとめたものが保管される。
特定レコードの取得
public function show(Request $request) { $id=$request->id; $item=DB::table('people')->where('id', $id)->first(); return view('hello.show', ['item'=>$item]); }showメソッド
$item=DB::table('people')->where('id', $id)->first();where
where('フィールド名', 値)SQLの
where フィールド名=値
のような感じfirst
最初のレコードを返す
getはすべてだがfirstは最初のものだけ1つしかレコードが無いとわかっているものはfirstを使う
演算記号を指定した検索
whereに3つの引数をもたせるとより複雑な検索ができる。
where(フィールド名,演算記号, 値)例
where('id','>', 5)
とすれば
IDが5より大きいものを検索できる。whereとorWhere
すべての条件に合致するものだけを検索
where(...)->where(...)条件に1つでも合致すればすべて検索
where(...)->orWhere(...)like検索
フィールド名 like '%テキスト%'そこにどんな文字があってもOK検索
例えば%abc%ならabcの前後にどんなテキストがあってもOKwhereRawによる条件検索
whereをいくつもつなぎ合わせるよりも条件を指定して検索できる
whereRaw(条件式,パラメータ配列)public function show(Request $request) { $min=$request->min; $max=$request->max; $items=DB::table('people')->whereRaw('age >= ? and age <= ?', [$min,$max])->get(); return view('hello,show',['items'->$items]); }
/show?min=20&max=50
とアクセスすればあげあ20以上50以下のものを検索する。age >= ? and age <= ?
?
のところにパラメータ配列が入る。
whereRawのプレースホルダは?になる。:nameという形式ではない並び順を指定
orderBy(フィールド名,'ascまたはdesc')
名前 説明 asc 昇順(1234,abcd..あいうえお) desc 降順(4321,dcba) getメソッドの前に書く
例
$items=DB::table('people')->oderBy('age','asc')->get();ofsetとlimit
大量のレコードが有る場合はそこから部分的に取り出して表示するほうが楽
指定した位置からレコードを取得
ofset(整数)例えばofset(10)なら最初から10個分だけ移動して11個めから取得する
指定した数だけレコードを収録
limit(整数)limit(10)なら10個だけ取得
insertによるレコード追加
DB::table(...)->insert(データをまとめた配列)public function create(Request $request) { $param=[ 'name'=>$request->name, 'mail'=>$request->mail, 'age'=>$request->age, ]; DB::table('people')->insert($param); return redirect('/hello'); }updateによるレコード更新
DB::table(...)->where(更新対象の指定)->update(配列);updateはinsertと同じ
ただしwhereでどのレコードを更新するのかを指定してあげないとすべてのレコードが更新されてしまう
- 投稿日:2020-07-22T12:33:53+09:00
Laravel カスタムバリデーション追加
Laravel5.5
PHP7入力フォームにバリデーションを設定するとき、
laravelのバリデーションルールでは、うまく設定できない。
そんな時、独自のバリデーションを作成して適用させようと思いました。その時に構築した方法を以下に記載します。
下記は、
フォームで役職を設定し、そのバリデーションするためのコードです。
下記のバリデーションを設定しようとしています。
①入力必須、数値
②数値はconfig.positionに設定されている値のみ①は、rulesにバリデーションを設定するだけです。
②には、laravelのバリデーションルールでは設定できないので独自のバリデーションを設定します。
PositionRequest.php<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class PositionRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'postion' => 'required|integer', ]; } // 役職のバリデーション public function withValidator($validator) { $validator->after(function ($validator) { if (!in_array($this->position, config('common.position'))) { $validator->errors()->add('position', '役職を正しく選択してください。'); } }); } }config/common.php'position' => [ '社員' => 10, '係長' => 20, '課長' => 30, '部長' => 40, '社長' => 50, ],公式に記載されている方法でコードを書きます。
https://readouble.com/laravel/5.5/ja/validation.htmlpublic function withValidator($validator) { $validator->after(function ($validator) { //ここに処理を記載する。 }); }今回は、config/common.php内のpositionに設定している値以外は、
エラー表示を行うバリデーションを設定します。if (!in_array($this->position, config('common.position'))) { $validator->errors()->add('position', '役職を正しく選択してください。'); }
- 投稿日:2020-07-22T12:26:30+09:00
仮想環境でLaravelのmigrateができない場合の解決方法
php artisan migrateが実行できない場合の解決方法
環境
MAC
Homebrew 2.4.8
MySQL Ver 8.0.21 for osx10.15 on x86_64 (Homebrew)
PHP 7.3.11 (cli) (built: Jul 5 2020 03:23:39) ( NTS )原因
configのキャッシュが残っている
解決方法
下記コマンドでconfigのキャッシュを消去後、再度migrate実行
php artisan config:clear別のエラーが出ている場合 エラーコード
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = laravel-course and table_name = migrations and table_type = 'BASE TABLE') at /Applications/MAMP/htdocs/laravel-course/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669 665| // If an exception occurs when attempting to run a query, we'll format the error 666| // message to include the bindings with SQL, which will make this exception a 667| // lot more helpful to the developer instead of just the database's errors. 668| catch (Exception $e) { > 669| throw new QueryException( 670| $query, $this->prepareBindings($bindings), $e 671| ); 672| } 673| Exception trace: 1 PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)") /Applications/MAMP/htdocs/laravel-course/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70 2 PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel-course", "root", "root", []) /Applications/MAMP/htdocs/laravel-course/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70 Please use the argument -v to see more details.エラー方法
1 MySQLに'データベース'を作成
2 作業用ユーザーの作成
3 env .database.phpの情報を合わせる.envの情報を以下にする
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE='データベース'
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock4
php artisan config:clear
php artisan migrate
で完了
- 投稿日:2020-07-22T10:39:36+09:00
非公開ディレクトリを使えないサーバでLaravelを設置する
はじめに
公開フォルダーの上位フォルダーにアクセス権が無い例としては、レンタルサーバーにお名前.comサーバが該当しますが、普通にはLaravelをインストールできないです。
公開フォルダでシステムファイルをさらすことに。そこで、公開フォルダーにLaravel用にフォルダーを作ってそこに入れてしまいます。
フォルダー構造
公開フォルダー/
├ .htaccess
├ index.php
├ /system ←ここにLaravelを沈める
│ ├ .htaccess
│ ├ /app
│ ├ /config
│ ├ /database
│ ├ /resources
│ ├ /routes
│ ├ /storage
│ └ /vendor
│
└ favicon.icoindex.phpの中身のパスを編集する
フォルダー構造を変えたので、パスを変更します。
index.php<?php /** * Laravel - A PHP Framework For Web Artisans * * @package Laravel * @author Taylor Otwell <taylor@laravel.com> */ define('LARAVEL_START', microtime(true)); /* |-------------------------------------------------------------------------- | Register The Auto Loader |-------------------------------------------------------------------------- | | Composer provides a convenient, automatically generated class loader for | our application. We just need to utilize it! We'll simply require it | into the script here so that we don't have to worry about manual | loading any of our classes later on. It feels great to relax. | */ require __DIR__.'/system/vendor/autoload.php'; /* |-------------------------------------------------------------------------- | Turn On The Lights |-------------------------------------------------------------------------- | | We need to illuminate PHP development, so let us turn on the lights. | This bootstraps the framework and gets it ready for use, then it | will load up this application so that we can run it and send | the responses back to the browser and delight our users. | */ $app = require_once __DIR__.'/system/bootstrap/app.php'; /* |-------------------------------------------------------------------------- | Run The Application |-------------------------------------------------------------------------- | | Once we have the application, we can handle the incoming request | through the kernel, and send the associated response back to | the client's browser allowing them to enjoy the creative | and wonderful application we have prepared for them. | */ $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); $kernel->terminate($request, $response);systemフォルダーの.htaccessを忘れずに
.htaccessを作成して中身をDeny from allを書いてsystemフォルダーに保存します。
Deny from all最後に
できれば、公開フォルダーにシステムを入れる事は避けたいです。
依頼者のサーバを変えれないような場合、
この方法で、設置しておけば、消しちゃ駄目なフォルダーと分かりやすいと思います。
メンテナンス作業やりやすいと思います。こんな感じで参考になれば。
ありがとうございます。
- 投稿日:2020-07-22T09:53:01+09:00
CakePHP3.8 と Laravel7.x の「書き方」の違い ~ORM周りその1~
CakePHP3.8 と Laravel7.x の「書き方」の違い ~ORM周りその1~
前: 設定周り
Model の作成・設定
- CakePHP は bake すれば設定など諸々自動で設定される(CakePHP の 命名規則に従っている限り)
https://book.cakephp.org/3/ja/quickstart.html#id5- laravel は make することはできるが、設定などは自分の手である程度書く必要がある
https://readouble.com/laravel/7.x/ja/eloquent.htmlクエリの要約
- CakePHP
カスタムファインダーメソッドで実装する
メソッド名を find〇〇 にし、 Query インスタンスを return する必要がある
public function findHyphen(Query $query, array $options) { return $query->where(['favorite' => 'KAT-TUN']); } public function findArasick(Query $query, array $options) { return $query->where(['favorite' => '嵐']); } public function findVeteran(Query $query, array $options) { return $query->where(['fan_career >' => '5']); }使うときは
Table::find()
,Query::find()
にファインダー名を渡す$usersTable = TableRegistry::getTableLocator()->get('Users'); $query = $usersTable->find('hyphen')->find('veteran');
- Laravel
ローカルスコープ で実装する
メソッド名を scope〇〇 にし、 Builder インスタンスを return する必要がある
public function scopeHyphen(Builder $query) { return $query->where('favorite', '=', 'KAT-TUN'); } public function scopeArasick(Builder $query) { return $query->where('favorite', '=', '嵐'); } public function scopeVeteran(Builder $query) { return $query->where('fan_career', '>', '3'); }使うときは
Model
,Builder
からスコープ名の関数を呼び出す$users = Users::hyphen()->veteran()->get();Iterable 問題(名前は勝手につけた)
ORM はそれぞれ、CakePHP => Query, Larabel => Builder だが、Iterable (簡単に言うと foreach できること)かどうかに違いがある。
- CakePHP
$query = $usersTable->find('hyphen')->find('veteran'); foreach ($query as $entity) // foreach されるタイミングで SQL が発行・fetch され、レコードを foreach することができる
- Laravel
$builder = Users::hyphen()->veteran(); foreach ($builder as $property) // iterable ではないので、普通のプロパティ参照のようになってしまう
- 投稿日:2020-07-22T00:08:27+09:00
Laravelの認証(web画面)
前提条件
eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っていますLaravelでJavaScript、CSSを使う
上記記事でnpm run dev
しています
本記事はnpm run dev
でapp.css、app.jsができている前提で書かれていますLaravelでメール送信する
上記記事でLaravelからメール送信できるようにしています
本記事はメール送信ができるようになっている前提で書かれていますLaravelでデータベースを扱う準備をする
Laravelでテーブル作成
Laravelで初期データ投入
Laravelでデータベースを操作する(Eloquent編)
本記事は上記ので作成したデータベースとレコードを使用します認証に必要なソース生成
コマンドラインで
cd sample
composer require laravel/ui
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押しますまたは、composer.jsonを修正
composer.json‥‥ "require": { ‥‥ "laravel/tinker": "^2.0", "laravel/ui": "^2.1" }, ‥‥"laravel/ui": "^2.1"追加しました
コマンドラインで
cd sample
composer update
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します上記
composer require laravel/ui
かcomposer update
のどちらかをしてくださいコマンドラインで
php artisan ui vue --auth
eclipseプロジェクトを右クリック→リフレッシュ
/sample/app/Http/Controllers/Auth、/sample/resources/views/authに多くのファイルが現れます
/sample/database/migrations/xxxx_xx_xx_xxxxxx_create_password_resets_table.phpも現れます
/sample/routes/web.phpに2行
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
追記されていますModel修正
(1) /sample/app/User.phpを/sample/app/Models/User.phpに移動します
/sample/app/ModelsフォルダはLaravelでデータベースを操作する(Eloquent編)で作成しました(2) /sample/app/Models/User.php修正
namespace App;
をnamespace App\Models;
に修正(3) /sample/config/auth.php修正
auth.php‥‥ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], ‥‥providers->users->modelをApp\Models\User::classに修正
(4) /sample/app/Http/Controllers/Auth/RegisterController.php修正
use App\User;
をuse App\Models\User;
に修正(5) /sample/database/factories/UserFactory.php修正
use App\User;
をuse App\Models\User;
に修正動作確認その1
http://localhost/laravelSample/
画面右上にLOGIN、REGISTERのリンクが現れました
REGISTERをクリックし、Name、E-Mail Address、Password、Confirm Passwordを入力してRegisterボタンをクリック
MySQLでlaravel_sampleデータベースを確認してみましょう
select * from users;
レコードが入っています右上のユーザー名プルダウンからLogoutをクリック
ログアウトできました右上のユーザー名プルダウンからLOGINをクリック
先ほど登録したE-Mail Address、Passwordを入力し、Loginボタンをクリック
ログインできました自動生成物の確認
先ほど実行した
php artisan ui vue --auth
で生成されたソースの中身を確認しましょう
(1) web.phpの確認
/sample/routes/web.phpに追記されたAuth::routes();
は
/sample/vendor/laravel/ui/src/AuthRouteMethods.phpのauth()メソッドの戻り値を実行します
AuthRouteMethods#authはAuthRouteMethods#resetPassword、AuthRouteMethods#confirmPassword、AuthRouteMethods#emailVerification
を状況にしたがって呼び出します
見ての通り、AuthRouteMethods.phpは認証に必要なルーティングが書かれているだけです
自動生成されたルーティングをまとめると下記になります// ログイン get('login', 'Auth\LoginController@showLoginForm') post('login', 'Auth\LoginController@login'); // ログアウト post('logout', 'Auth\LoginController@logout') // ユーザー登録 get('register', 'Auth\RegisterController@showRegistrationForm') post('register', 'Auth\RegisterController@register'); // パスワード再発行メール送信前の操作 get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm') post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail') // パスワード再発行メール送信後の操作 get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm') post('password/reset', 'Auth\ResetPasswordController@reset') // 特定URLアクセス時のパスワード入力要求 get('password/confirm', 'Auth\ConfirmPasswordController@showConfirmForm') post('password/confirm', 'Auth\ConfirmPasswordController@confirm'); // ユーザー登録後のメールアドレス確認 get('email/verify', 'Auth\VerificationController@show') get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify') post('email/resend', 'Auth\VerificationController@resend') get('/home', 'HomeController@index')また、web.phpに定義しているルーティングに->middleware('auth');をつけると認証済みユーザーのみアクセスできるurlになります
例
Route::get('sample/jscss', 'SampleController@jscss')->middleware('auth');
これでhttp://localhost/laravelSample/sample/jscss
にアクセスしようとするとログイン認証を要求されます(2) Controllerクラスの確認
上記ルーティングに書かれているコントローラークラスの中を見ると実処理はトレイトに書かれていることがわかります
各コントローラーの実処理が書かれているトレイトは/sample/vendor/laravel/ui/auth-backendに入っています
対応表です
機能 app/Http/Controllers/Auth配下のコントローラー vendor/laravel/ui/auth-backend配下のトレイト 特定URLアクセス時のパスワード入力要求 ConfirmPasswordController.php ConfirmsPasswords.php パスワード再発行メール送信前の操作 ForgotPasswordController.php SendsPasswordResetEmails.php ログイン、ログアウト LoginController.php AuthenticatesUsers.php ユーザー登録 RegisterController.php RegistersUsers.php パスワード再発行メール送信後の操作 ResetPasswordController.php ResetsPasswords.php ユーザー登録後のメールアドレス確認 VerificationController.php VerifiesEmails.php トレイト内の処理は読めば分かるので、紹介はすこしだけにします
・RegistersUsers.phpのregister
トレイトvendor/laravel/ui/auth-backend/RegistersUsers.phpのregisterメソッドは、app/Http/Controllers/Auth/RegisterController.phpのregisterメソッドとなります。つまり、ユーザー登録メソッドです
event(new Registered($user = $this->create($request->all())));
の$this->create($request->all())
部分でRegisterController.phpのcreateが呼ばれ、その中でUser::createが実行されます。User::createでusersテーブルにレコードがinsertされます
$this->guard()
はAuth::guard()が実行され、SessionGuardが返ってきます。$this->guard()->login($user);
でログインです・guard
guardは認証まわりの処理が書かれたクラスです
Auth::guard()
の戻り値はvendor/laravel/framework/src/Illuminate/Auth/SessionGuard.phpです
Auth::guard()は/sample/config/auth.phpの記述に対応したguardを返します。
auth.phpのdefaults->guardの値がwebなので、auth.phpのguards->web->driverの値を取り、それがsessionなので、SessionGuardを返します。SessionGuardの$this->provider
には/sample/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.phpが入っています。これもauth.phpで設定しているためです。auth.phpのproviders->users->driverがeloquentだからです
EloquentUserProviderの$this->modelにはApp\Models\Userが入っています。これもauth.phpで設定しているためです。auth.phpのproviders->users->modelがApp\Models\User::classだからです・event
RegistersUsersでevent()が実行されています。event関数は与えられた引数のクラス名をキーにして、app/Providers/EventServiceProvider.phpの$listenから値を取得し、その値のクラスのhandleメソッドを実行します・ログインの時に使う認証項目
デフォルトではログインの時、E-Mail AddressとPasswordを入力することになっていますが、入力項目をE-Mail Addressでないものにすることができます。なぜE-Mail AddressになっているかというとLoginController.phpで使っているトレイトvendor/laravel/ui/auth-backend/AuthenticatesUsers.php内のusername()関数が'email'を返しているからです。LoginControllerでusernameメソッドを定義しusersテーブルの別のカラムを返すようにすれば、emailではない項目を認証に使用できるようになります・ユーザー登録の時に使う項目
ユーザー登録時の入力項目はデフォルトではname、email、passwordですが、もっと項目を増やしたい場合、tableにカラム追加し、viewにも項目を増やし、RegisterControllerのvalidatorメソッドとcreateに増やした項目の処理を追記し、App\Models\Userの$fillableにも増やした項目を追加します・ログイン認証回数制限
ログイン認証を何回試みることを許可するか。その回数失敗したら何分間ログインできなくするかを設定できます
LoginControllerにmaxAttemptsとdecayMinutesというプロパティを定義します
// 最大ログイン認証回数
protected $maxAttempts = 5;
// $maxAttempts回ログイン失敗したら何分ログインできなくするか
protected $decayMinutes= 1;
これらはThrottlesLoginsというトレイトで使われています。
(コントローラー)app/Http/Controllers/Auth/LoginController.php->(トレイト)vendor/laravel/ui/auth-backend/AuthenticatesUsers.php->(トレイト)vendor/laravel/ui/auth-backend/ThrottlesLogins.php
maxAttempts()関数とdecayMinutes()関数が定義されています。そこで使われます。プロパティを定義しなかった場合、デフォルトで5回、ロック1分になっていることもわかります
また、hasTooManyLoginAttemptsが認証失敗制限回数になったか判定するメソッド、sendLockoutResponseがロックがかかったことを知らせるレスポンスを返すメソッドです(3) viewの確認
/sample/resources/views/auth配下にviewは格納されています
説明が必要な難しい内容にはなっていません
画面の見た目は必ず変えると思います
/sample/resources/views/auth配下のbladeファイルを好きなように変更してくださいAuthファサード
Authファサードという認証ユーザーに関する便利メソッドを利用できます
use Illuminate\Support\Facades\Auth;
// 現在認証されているユーザーの取得
$user = Auth::user();
if (Auth::check()) {
// ユーザーはログインしている
}
上記のように簡単に認証済みユーザーを取得できたり、ログイン済みかどうか判定できます
このAuthファサードですが、Authファサード実行時呼ばれるのは、vendor/laravel/framework/src/Illuminate/Auth/AuthManager.phpです。このAuthManagerにメソッドが定義されていればAuthManagerのメソッドが呼ばれ、AuthManagerに定義されていないメソッドであれば、guardのメソッドが呼ばれます
Auth::user()ならAuthManagerにuserというメソッドは無いので、SessionGuardのuserメソッドが呼ばれます。Auth::check()ならAuthManagerにcheckというメソッドは無いので、SessionGuardのcheckメソッドが呼ばれています(SessionGuardのcheckメソッドは、SessionGuardで使われているGuardHelpersトレイトで実装されてます)
Auth::guard()なら、AuthManagerに定義されているのでAuthManagerのguardメソッドが呼ばれます
AuthManager
SessionGuardユーザー登録時のメールアドレス確認
ユーザー登録時に入力されたメールアドレス宛に実際にメールを送信し、そのメールに記載されているリンクをクリックしてもらい、メールアドレス確認をするように改修します
SMTPサーバーの設定をしてない方は下記記事を参考に事前にしておいてください
Laravelでメール送信するメール送信される流れは下記です
ユーザー登録時
vendor/laravel/ui/auth-backend/RegistersUsers.phpのregisterメソッド内で
event(new Registered($user = $this->create($request->all())));
が呼ばれ、app/Providers/EventServiceProvider.phpによって登録されている
SendEmailVerificationNotificationクラスのhandleメソッドが実行され
app/Models/User.phpのsendEmailVerificationNotificationメソッドが呼ばれます
これでメールが送信されます
User.phpのsendEmailVerificationNotificationメソッドで呼んでいる$this->notify
はメール送信を実行するメソッドです。notifyメソッド定義場所は下記です
User.php->(トレイト)vendor/laravel/framework/src/Illuminate/Notifications/Notifiable.php->(トレイト)vendor/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php
$this->notify
の中では
vendor/laravel/framework/src/Illuminate/Notifications/ChannelManager.phpのsendを実行してメール送信していますではユーザー登録時メール送信するために必要なものを作っていきます
(1) メール本文の作成
/sample/resources/views/sample/registerUser.blade.phpファイル作成registerUser.blade.php<html> <body> <a href="{{$url}}">メールアドレスの確認</a> </body> </html>(2) 通知クラスの作成
/sample/app/Notificationsフォルダ作成
/sample/app/Notifications/RegisterUser.phpファイル作成RegisterUser.php<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; use Illuminate\Auth\Notifications\VerifyEmail; class RegisterUser extends VerifyEmail { use Queueable; public function toMail($notifiable) { $verificationUrl = $this->verificationUrl($notifiable); return (new MailMessage) ->subject('ユーザー登録') ->view('sample.registerUser', ['url' => $verificationUrl]); } }(3) Modelの修正
/sample/app/Models/User.php修正User.php‥‥ use App\Notifications\RegisterUser; ‥‥ class User extends Authenticatable implements MustVerifyEmail ‥‥ public function sendEmailVerificationNotification() { $this->notify(new RegisterUser()); } ‥‥use文追記
implements MustVerifyEmail追記
sendPasswordResetNotificationメソッド追加
これでvendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.phpのhandleメソッド内のif文がtrueになります(4) ルーティング修正
/sample/routes/web.php修正‥ /* Auth::routes(); */ Auth::routes(['verify' => true]); ‥Auth::routes()に引数['verify' => true]を渡す
これによって、vendor/laravel/ui/src/AuthRouteMethods.phpのauthメソッド内if ($options['verify'] ?? false)がtrueになり、emailVerificationメソッド内のルーティングが有効になります動作確認その2
http://localhost/laravelSample/
画面右上のREGISTERをクリックし、Name、E-Mail Address、Password、Confirm Passwordを入力してRegisterボタンをクリック
入力したE-Mail Address充てにメールが送信されました
そのメールにあるリンクをクリックします
MySQLでlaravel_sampleデータベースを確認してみましょう
select * from users;
email_verified_atカラムにクリックした時刻が入っていますパスワードリセットの実装
ユーザーがパスワードを忘れた場合のパスワードリセットを実装します
パスワードリセット希望時にはメール送信が行われ、そのメールに記載されているリンクからパスワード再設定画面に遷移します
メール送信される流れは下記です
パスワードリセット画面でSend Password Reset Linkボタンをクリック時
vendor/laravel/ui/auth-backend/SendsPasswordResetEmails.phpのsendResetLinkEmailメソッド内の$this->broker()でvendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.phpを取得し、PasswordBrokerのsendResetLinkを実行します
PasswordBrokerのsendResetLink内で
app/Models/User.phpのsendPasswordResetNotificationメソッドが呼ばれます
これでメールが送信されますではそれを実行するために必要なものを作っていきます
(1) password_resetsテーブルの作成
先ほどphp artisan ui vue --auth
をしたときに
/sample/database/migrations/xxxx_xx_xx_xxxxxx_create_password_resets_table.php
ができています
これをデータベースに流し込みますコマンドラインで
cd sample
php artisan migrate
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押しますMySQLでlaravel_sampleデータベースを確認してみましょう
desc password_resets;
password_resetsテーブルができました(2) メール本文の作成
/sample/resources/views/sample/resetPassword.blade.phpファイル作成resetPassword.blade.php<html> <body> <a href="{{$url}}">パスワードリセット</a> <div>このリンクは{{$limit}}分後に期限切れになります</div> </body> </html>(2) 通知クラスの作成
/sample/app/Notifications/ResetPassword.phpファイル作成ResetPassword.php<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; class ResetPassword extends Notification { use Queueable; public $token; public function __construct($token) { $this->token = $token; } public function via($notifiable) { return ['mail']; } public function toMail($notifiable) { $url = url(route('password.reset', [ 'token' => $this->token, 'email' => $notifiable->getEmailForPasswordReset(), ], false)); return (new MailMessage) ->subject('パスワードリセット') ->view('sample.resetPassword', ['url' => $url, 'limit' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')]); } public function toArray($notifiable) { return []; } }(3) Modelの修正
/sample/app/Models/User.php修正User.php‥‥ use App\Notifications\ResetPassword; ‥‥ public function sendPasswordResetNotification($token) { $this->notify(new ResetPassword($token)); } ‥‥use文追記
sendPasswordResetNotificationメソッド追加動作確認その3
http://localhost/laravelSample/
画面右上のLOGINをクリックし、Forgot Your Password?リンクをクリック
E-Mail Addressを入力し、Send Password Reset Linkボタンをクリック
入力したE-Mail Address充てにメールが送信されました
そのメールにあるリンクをクリックします
Passwordを再設定する画面に遷移します