tanaka's Programming Memo

プログラミングについてのメモ。

Laravel5.3でSentinelを利用する(1)LaravelとSentinel、Codeceptionのインストール

次へ

完成プロジェクト→ GitHub - am1tanaka/lara5.3-sentinel at ver1.1.1


はじめに

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機能を使う
    • メールドライバーは smtp を利用
    • SMTPサーバーが利用できない場合は、 Mailgun や SparkPost といったメール送信サービス用のドライバーを利用すると良い



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
  • 上記でMySQLにログインできない場合は、MySQLサーバーを起動
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を、設定したパスワードに変更。任意に設定したパスワードを書く
    • メールについて設定する。macPostfixで送信できる場合は、以下のように設定。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');
    }
  • テストを簡単に実行するために、 package.json を設定する。package.jsonを開いて、"scripts"の設定を以下のようにする
  "scripts": {
    "prod": "gulp --production",
    "dev": "gulp watch",
    "test": "composer exec codecept run"
  },
  • 以下でテストを実行できる
npm test

以上で、Codeceptionの組み込みは完了です。Codeceptionでのテストは、テスト用のデータベース上で実施され、毎回マイグレーションし直すので、まっさらな状態から開始します。

エラーが発生する場合は、データベースの設定が間違えている可能性があるので、 .env.testing のデータベース関連の設定を見直してください。



次へ