完成プロジェクト→ GitHub - am1tanaka/lara5.3-sentinel at ver1.1.1
目次
- 目次
- はじめに
- 前提環境
- 実装の方針
- Laravelのバージョン確認とインストール
- データベースを作成する
- Laravelの環境設定
- 起動テスト
- Sentinelをインストール
- 認証用のビューを作る
- Codeception を組み込む
はじめに
PHPのフレームワークLaravelには簡単な認証や認可ができるauthパッケージが組み込まれていますが、ユーザー登録時にメールの確認などなしにいきなり登録できてしまいます。
Sentinelは上記のような機能を持つPHPフレームワークで、Laravel5に組み込むための機能を提供してくれています。Sentinelが提供するのはロジックだけで、ビューやユーザー確認用のメールなどは自前で実装する必要がありますが、それでも手間は相当減らせます。
上記を組み合わせた環境をmac上で構築する作業メモです。完成プロジェクトはこちら→GitHub - am1tanaka/lara5.3-sentinel: Laravel5.3+Sentinelのユーザー認証サンプル
前提環境
- Laravel5.3
- Sentinel2.0.13以降
- macOS Sierra 10.12.1
- PHP5.6.19
- MySQL5.7.16
- composer version 1.2.1
- Postfixを設定して、macからgmailなどを通してメール送信できる環境が構築できている
- 記事内には登場しないが、MySQLの操作を楽にする Sequel Pro のインストールをオススメ
実装の方針
- テスト用のフレームワーク Codeception を利用する
- Sentinelの first_name と last_name は、 name に統一する
- メールでの通知を Notification で実装する
- Notification はキューに積む
- キュードライバーは sync を使用
- 必要になったら他のドライバーの環境を構築する方針とする
- メール送信は、5.3の新しいMail機能を使う
Laravelのバージョン確認とインストール
- macでターミナルを起動
- プロジェクトフォルダーを作るフォルダーに移動
- laravel -v を実行して、コマンドが見つからなかったら以下でグローバル環境にLaravelをインストールする
composer global require "laravel/installer"
- Laravelをインストール済みだった場合、以下でバージョンを最新版にしておく
composer global update
- 以下で、Laravelのプロジェクトを作成して、中に入る
laravel new lara5.3-sentinel cd lara5.3-sentinel
データベースを作成する
今回のサンプルで操作するためのデータベースを作成します。
- MySQL にログインする
mysql -u ユーザー名 -p
sudo mysqld_safe
- データベースを作成する。以下は、lara_sentinelというデータベースと、テスト用のlara_sentinel_testを作成する例
create database lara_sentinel; create database lara_sentinel_test;
- 操作用のユーザーを作成して、権限を与えておく。以下は、user_lara_sentというローカルホスト上のユーザーを作成する例。パスワードは任意
CREATE USER 'user_lara_sent'@'localhost' IDENTIFIED BY 'YourPassword';
- 作成したローカルホストのuser_lara_sentユーザーに、lara_sentinelデータベースへのアクセス権限を与える
GRANT ALL PRIVILEGES ON lara_sentinel.* TO 'user_lara_sent'@'localhost'; GRANT ALL PRIVILEGES ON lara_sentinel_test.* TO 'user_lara_sent'@'localhost'; exit
Laravelの環境設定
- Atomなどのエディターで、上記で作成したlara5.3-sentinelのプロジェクトフォルダーを開く
- .envを開いて、各種設定を行う
- APP_URLを、 http://localhost:8000 に変更
- DB_DATABASEを、作成したデータベース名に変更。ここでは lara_sentinel
- DB_USERNAMEを、作成したユーザー名に変更。ここでは、 user_lara_sent
- DB_PASSWORDを、設定したパスワードに変更。任意に設定したパスワードを書く
- メールについて設定する。macのPostfixで送信できる場合は、以下のように設定。MAIL_FROM_ADDRESSとMAIL_FROM_NAMEは適した内容に変更のこと
MAIL_DRIVER=smtp MAIL_HOST=localhost MAIL_PORT=25 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=hello@example.com MAIL_FROM_NAME=ExampleFrom
- config/mail.php を開く
- 以下のように書き換え
'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ],
起動テスト
Laravelの起動を試します。
- ターミナルで、プロジェクトフォルダーから以下を実行
php artisan serve
Webブラウザーから http://localhost:8000 にアクセスして「Laravel」と表示されたら成功です。
Sentinelをインストール
Sentinel の公式ページのインストール手順に従います。
- Laravelプロジェクトを起動し続ける場合、新しいターミナルを開いて、プロジェクトフォルダーを開く
- プロジェクトフォルダー内から以下を実行してインストールする
composer require cartalyst/sentinel
- インストールが完了したら、 config/app.php を開く
- providers の配列を探して、その中に以下の行を加える
/* * Sentinel Service Providers... */ Cartalyst\Sentinel\Laravel\SentinelServiceProvider::class,
- その下の aliases の配列に、以下を加える
// Sentinel Aliases 'Activation' => Cartalyst\Sentinel\Laravel\Facades\Activation::class, 'Reminder' => Cartalyst\Sentinel\Laravel\Facades\Reminder::class, 'Sentinel' => Cartalyst\Sentinel\Laravel\Facades\Sentinel::class,
- 上書き保存する
- ターミナルから以下を実行して、resourcesフォルダーにvendor関連のリソースを出力する
php artisan vendor:publish
テーブルを作成するための設定ファイルが出力されたので、 users テーブルの first_name と last_name を削除して、nameにするための変更を加えます。
- database/migrations/2014_07_02_230147_migration_cartalyst_sentinel.php を開く
- [Schema::create('users', ]から始まるコードを探して、以下のように修正する
Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('email'); $table->string('password'); $table->text('permissions')->nullable(); $table->timestamp('last_login')->nullable(); $table->string('name')->nullable(); // この辺りを修正 $table->timestamps(); $table->engine = 'InnoDB'; $table->unique('email'); });
既存のユーザーテーブルは不要なので、マイグレーションで作成されないように以下のファイルを削除します。
- database/migrations/2014_10_12_000000_create_users_table.php
- database/migrations/2014_10_12_100000_create_password_resets_table.php
データベースを作成します。
- 以下をターミナルで実行
php artisan migrate
- ここでエラーが発生したら、.envを確認してデータベースの接続情報が合っているかや、MySQLサーバーが起動しているかを確認する
- config/cartalyst.sentinel.php をエディターで開いて、 'users' の設定を以下のように修正して、ここで作成したユーザーモデルに接続する
'users' => [ 'model' => 'App\User', ],
以上でSentinelの設置は完了です。 config/cartalyst.sentinel.php にSentinelの設定があるので、必要があれば変更します。
Webブラウザーで http://localhost:8000 を再読み込みして、エラーが発生しなければここまで成功です。
認証用のビューを作る
手間を減らすために、認証関連のビューやコントローラーを既存のauth機能から取り込みます。すべて手製で作るのであればこの手順は不要です。
- ターミナルからプロジェクトフォルダー内で以下を実行
php artisan make:auth
http://localhost:8000 を再読み込みすると、画面の右上に認証のための[LOGIN]と[REGISTER]のリンクが追加されます。現時点では Laravel の auth 機能が実装されているので、正しく動作しません。これをSentinelに差し替えていきます。
Codeception を組み込む
テスト用フレームワークのCodeceptionを組み込みます。公式サイトはこちら。
Laravel5.3 テストでテスト専用のデータベースを使う - tanaka's Programming Memo に簡単な使い方をメモしています。
- ターミナルで以下を実行
composer require codeception/codeception --dev composer exec codecept bootstrap composer exec codecept run
以上で、Codeceptionの組み込み、設定ファイルの展開、テスト実行が完了します。現時点ではテスト内容がないので、「No tests executed!」と表示されれば成功です。
Codeception用の設定
Codeceptionを実行するときには、テスト用のデータベースに接続したいので、以下の通りで設定を作成します。
- ターミナルで以下を実行して、 .env.testing という設定ファイルを作成
cp .env .env.testing
- エディターで .gitignore を開いて、以下を追加して、テスト設定をgitから外す
.env.testing
- .env.testing をエディターで開いて、 DB_DATABASE の項目を以下のようにテスト用に変更
DB_DATABASE=lara_sentinel_test
- ユーザーやパスワードを変更していたら、それらも修正する
次に、Laravel5でのテスト用の設定を行います。とりあえず、Functionalテストを実施する設定です。
- tests/functional.suite.yml をエディターで開く
class_name: FunctionalTester modules: enabled: - Laravel5: environment_file: .env.testing run_database_migrations: true - \Helper\Functional
以上で、 Codeception のテストが Laravel5 に対応して、テストごとにデータベースが作り直されます(migration)。
テストを準備
開発はテストコードを書きながら行います。まずはルートを呼び出すと[Laravel]と表示されるかのテストです。
- ターミナルで以下を実行して、テスト用のCestファイルを作成
composer exec codecept g:cest functional Open
- tests/functional/OpenCest.php ファイルが出来上がっているので、エディターで開いて、 tryToTest メソッドを以下のように書き加える
public function tryToTest(FunctionalTester $I) { $I->amOnPage('/'); $I->see('Laravel'); }
"scripts": { "prod": "gulp --production", "dev": "gulp watch", "test": "composer exec codecept run" },
- 以下でテストを実行できる
npm test
以上で、Codeceptionの組み込みは完了です。Codeceptionでのテストは、テスト用のデータベース上で実施され、毎回マイグレーションし直すので、まっさらな状態から開始します。
エラーが発生する場合は、データベースの設定が間違えている可能性があるので、 .env.testing のデータベース関連の設定を見直してください。