20200722のlaravelに関する記事は8件です。

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:generate

Scheduler

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Vagrant】Laravel homesteadでVagrantUpができない。

メモとして残します。

よくわかりませんが、vagrant upしたらエラーが出て起動できなかったため、
私が解消した方法をメモ。

エラー内容

There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

解消方法

VirtualBoxが認識できていないようだったので、私はVirtualBoxをアンインストール→インストールでエラーを解消できました。

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

【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の前後にどんなテキストがあってもOK

whereRawによる条件検索

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でどのレコードを更新するのかを指定してあげないとすべてのレコードが更新されてしまう

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

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.html

public function withValidator($validator) {
    $validator->after(function ($validator) {
        //ここに処理を記載する。
    });
}

今回は、config/common.php内のpositionに設定している値以外は、
エラー表示を行うバリデーションを設定します。

if (!in_array($this->position, config('common.position'))) {
    $validator->errors()->add('position', '役職を正しく選択してください。');
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

仮想環境で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.sock

4 
php artisan config:clear

php artisan migrate
で完了

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

非公開ディレクトリを使えないサーバでLaravelを設置する

はじめに

公開フォルダーの上位フォルダーにアクセス権が無い例としては、レンタルサーバーにお名前.comサーバが該当しますが、普通にはLaravelをインストールできないです。
公開フォルダでシステムファイルをさらすことに。

そこで、公開フォルダーにLaravel用にフォルダーを作ってそこに入れてしまいます。

フォルダー構造

公開フォルダー/
 ├ .htaccess
 ├ index.php
 ├ /system ←ここにLaravelを沈める
 │ ├ .htaccess
 │ ├ /app
 │ ├ /config
 │ ├ /database
 │ ├ /resources
 │ ├ /routes
 │ ├ /storage
 │ └ /vendor
 │  
 └ favicon.ico

index.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

最後に

できれば、公開フォルダーにシステムを入れる事は避けたいです。
依頼者のサーバを変えれないような場合、
この方法で、設置しておけば、消しちゃ駄目なフォルダーと分かりやすいと思います。
メンテナンス作業やりやすいと思います。

こんな感じで参考になれば。
ありがとうございます。

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

CakePHP3.8 と Laravel7.x の「書き方」の違い ~ORM周りその1~

CakePHP3.8 と Laravel7.x の「書き方」の違い ~ORM周りその1~

前: 設定周り

Model の作成・設定

クエリの要約

  • 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 ではないので、普通のプロパティ参照のようになってしまう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/uicomposer 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を再設定する画面に遷移します

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