20200625のlaravelに関する記事は9件です。

ElasticBeanstalkのWorkerサーバーでLaravelのスケジューラを実行する

ElasticBeankTalk及び、Workerサーバー、またLaravelについての説明はしないので知らない人は対象外です。

まず、Laravelのタスクスケジューラですが、一般的にはcronを以下のように設定して利用します。

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

ElasrticBeanstalkで利用する場合にどの様にcronを設定するのが良いでしょうか。
また、オートスケールなどでインスタンスが増えても1台だけが実行されることを守るにはどうしたら良いでしょう。

そんなときはElasticBeanstalkの機能を利用すると実現できます。
まずはcron.yamlというファイルをアプリケーションのルートディレクトリに作成します。
※このとき、cron.ymlというファイル拡張子だと何故かEBで認識されませんでした

cron.yaml
version: 1
cron:
 - name: "backup-job"
   url: "/backup"
   schedule: "0 */12 * * *"
 - name: "audit"
   url: "/audit"
   schedule: "0 23 * * *"

こちらは公式開発者ガイドの例です。
scheduleにcronの時間設定、urlにその際に実行してほしいHTTPエンドポイントが設定できることが見てわかります。

これだけではHTTPエンドポイントが利用されるのでLaravelのタスクスケジューラは利用できません。
なので、以下のライブラリを導入しましょう。

https://github.com/dusterio/laravel-aws-worker
導入方法はリポジトリを参照してください。

先程のcron.yamlは以下のように設定しましょう。

cron.yaml
version: 1
cron:
 - name: "schedule"
   url: "/worker/schedule"
   schedule: "* * * * *"

これだけです。
これでEBでは毎分/worker/scheduleを実行するQueueを発行します。

オートスケール時などは、EBはDynamoDBを利用してcronを実行するインスタンスのリーダーを選出しているそうです。
リーダーのインスタンスが利用できない状態になると、別のインスタンスがリーダーに再選出される仕組みになっています。

これで安心してタスクスケジューラを利用できますね。

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

composerの調子が悪かったがなんとか解決

Debugbarをインストールしようとしたんですがプロンプトが途中で止まって返ってこなくなりました。

$ composer require barryvdh/laravel-debugbar --dev

問題

調子が悪い時は以下のコマンドでどこが悪いかを調べるそうです。

$ composer diagnose

しかし、私の場合以下の場所でフリーズしました。

$ composer diagnose
composer diagnoseChecking composer.json: OK
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist:

対策

$ composer self-update --preview
$ composer update -v
$ composer diagnose

Debugbarの設定の続き

やっとインストールできたので設定を追記して動作確認

config/app.php
    'providers' => [
+       Barryvdh\Debugbar\ServiceProvider::class,
    ],

    'aliases' => [
+       'Debugbar' => Barryvdh\Debugbar\Facade::class,
    ]

参考

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

Can't open /home/laradock/.nvm/nvm.sh がでたとき

/etc/hosts に以下を追記
(具体的なIPアドレスはhttps://githubusercontent.com.ipaddress.com/raw.githubusercontent.com ここで調べられる)

199.232.68.133 raw.githubusercontent.com

Windowsユーザの場合は、ローカルにあるhostsファイルも編集が必要

C:\Windows\System32\drivers\etc\hosts

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

【Laravel】Herokuでメール送れるようにする

問題

Laravelってユーザー認証とか用意してくれてありがたいよね
laravel new で作ったアプリにAuth入れてユーザー登録はうまくいった
ただ、パスワードリセット用のメールを送ろうとしたら、エラー500が出て何時間も詰まった
環境変数とか設定してないから、そりゃエラーは出るだろうけど、それだけじゃなかったので備忘録として記しておこう

前提

Laravel6です
なので、laravel/uiをインストールするところから始めます
初心者にとってはおまじないですが、以下を実行

// laravel/uiをインストール
% composer require laravel/ui

// Auth関連ファイル(基本的なスキャフォールド)を生成
% php artisan ui vue --auth

// フロントエンドに必要なパッケージをインストール&必要なファイルをコンパイル・ビルド
% npm install && npm run dev

このようにしてAuth機能を使えるようになっていることが前提です

解決法

解決法というかメール送れるようにする方法
今回は、GメールのSMTPを使ってメールを送れるようにしたいと思います
行うことは以下のリスト

  • Gメール側でアプリパスワードを生成
  • Herokuの環境変数設定
  • mail.phpの編集

では順にやっていきましょう

アプリパスワードの生成

Googleアカウントからセキュリティ→Googleへログインパネルのアプリパスワード
※2段階認証をオンにしないとアプリパスワードは出てこない
パスワード聞かれるので入力
デバイス名をその他でアプリ名(何でも良さそう?)を記入→生成
基本、生成したパスワードは覚えておく必要がないが、これをあとで環境変数に設定するのでメモしておく

Herokuの環境変数を設定

% heroku config:set MAIL_MAILER=smtp
% heroku config:set MAIL_HOST=smtp.gmail.com
% heroku config:set MAIL_PORT=587
% heroku config:set MAIL_USERNAME=自分のGmailアドレス
% heroku config:set MAIL_PASSWORD=アプリパスワード(16桁)
% heroku config:set MAIL_ENCRYPTION=tls 
% heroku config:set MAIL_FROM_ADDRESS=自分のGmailアドレス
% heroku config:set MAIL_FROM_NAME=アプリ名

TLSの代わりにSSLを使う場合は以下農用に設定してください

% heroku config:set MAIL_PORT=465
% heroku config:set MAIL_ENCRYPTION=ssl

ローカル環境でメール送信を行いたい場合は、これと同様の環境設定を.envファイルに書き込む

mail.phpの編集

デフォルトで設定してあるなら編集する必要はないですね
確認してください

config/mail.php
'default' => env('MAIL_MAILER', 'smtp')

smtpの設定は、さらに下の方でデフォルトで設定してあるので、そのまま使いましょう

おわり

3つのことを行うだけで、Heroku実環境でLaravelアプリからメールが送れるようになります
簡単ですね
もし、これでもエラーが出てしまった場合は、エラーをしっかり読んで調べましょう
エラー500などのページしか出てこない場合は、Herokuの環境変数にAPP_DEBUG=trueを設定してみましょう
エラーを確認した後は必ずAPP_DEBUG=falseに戻しておきましょう

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

【Laravel7でユーザー認証_8】メールアドレス変更時にメール認証を行う

はじめに

Laravelのユーザー認証機能を利用する際、会員がメールアドレスを変更したら、メール認証を実行する手順をまとめます。

環境

XAMPP環境でLaravelが使えるように設定してあります。

  • Windows10 Pro 64bit
  • PHP 7.3.18
  • Laravel 7.12.0
  • MariaDB 10.1.32

また、Laravelプロジェクトは以下の手順で作業を進めており、会員登録時にメール認証を行う段階までできている状態です。

実装手順

メールアドレス変更時、メール認証をリセットする

メールアドレスを変更する処理の中に、メール認証をリセットする処理(email_verified_at をNULLにする)を追加します。

app/Http/Controllers/SettingController.php
      public function changeEmail(ChangeEmailRequest $request)
      {
        //ValidationはChangeUsernameRequestで処理
        //メールアドレス変更処理
        $user = Auth::user();
        $user->email = $request->get('email');
+       $user->email_verified_at = null;
        $user->save();

        //homeにリダイレクト
        return redirect()->route('setting')->with('status', __('Your email address has been changed.'));
      }
  }

認証メールを送信する

メール認証のリセット処理の後、引き続き認証用のメールを送信します。
ユーザー登録時の処理をなぞってみると、認証用のメールはUsers クラスの sendEmailVerificationNotification メソッドで送れるようです。

notify を使って $user->notify(new VerifyEmail()); という書き方もできそうです。
その場合は use Illuminate\Auth\Notifications\VerifyEmail; を忘れずに。

処理完了のメッセージも変更しておきます。

app/Http/Controllers/SettingController.php
      public function changeEmail(ChangeEmailRequest $request)
      {
        //ValidationはChangeUsernameRequestで処理
        //メールアドレス変更処理
        $user = Auth::user();
        $user->email = $request->get('email');
        $user->email_verified_at = null;
        $user->save();
+       $user->sendEmailVerificationNotification();

        //homeにリダイレクト
-       return redirect()->route('setting')->with('status', __('Your email address has been changed.'));
+       return redirect()->route('setting')->with('status', __('A confirmation email for changing the email address has been sent.'));
      }
  }

同じメールアドレスの場合、何も処理せずに完了表示とする

メールアドレスの変更処理を行った際、同じメールアドレスであれば特に処理せずに「完了しました」と表示させたいと思います。
(エラー表示にしたい場合は、FormRequestwithValidator を定義するとよさそうです。)

app/Http/Controllers/SettingController.php
      public function changeEmail(ChangeEmailRequest $request)
      {
        //ValidationはChangeUsernameRequestで処理
        //メールアドレス変更処理
        $user = Auth::user();
+ 
+       if ($user->email == $request->get('email')){
+           return redirect()->route('setting')->with('status', __('Your email address has been changed.'));
+       }
+
        $user->email = $request->get('email');
        $user->email_verified_at = null;
        $user->save();
        $user->sendEmailVerificationNotification();

        //homeにリダイレクト
        return redirect()->route('setting')->with('status', __('A confirmation email for changing the email address has been sent.'));
      }
  }

日本語対応

resources/lang/ja.json
+     "A confirmation email for changing the email address has been sent.": "メールアドレス変更の確認メールを送信しました。"
  }

未認証の場合もメールアドレス変更フォームを使えるよう変更

認証が通っていないユーザーも、メールアドレス変更のフォーム表示 showChangeEmailForm と処理changeEmail ができるように、__construct の定義を変更します。
(ここで表示部分だけ許可したがために、ハマりました……。)

->except で複数指定したいので、配列にして渡します。

app/Http/Controllers/SettingController.php
      public function __construct()
      {
          $this->middleware('auth');
-         $this->middleware('verified')->except('index');
+         $this->middleware('verified')->except(['index', 'showChangeEmailForm', 'changeEmail']);
      }

viewについても、リンクが切れないように修正します。

resources/views/setting/index.blade.php
                        <a href="{{ route('email.form') }}"
-                       @if ($auth->email_verified_at)
                          class="list-group-item list-group-item-action d-flex justify-content-between align-items-center"
-                       @else
-                          class="list-group-item list-group-item-action d-flex justify-content-between align-items-center disabled" tabindex="-1" aria-disabled="true"
-                       @endif
                        >
                          <dl class="mb-0">
                            <dt>{{ __('E-Mail Address') }}</dt>
                            <dd class="mb-0">{{ $auth->email }}</dd>
                          </dl>
-                         @if ($auth->email_verified_at)
                          <div><i class="fas fa-chevron-right"></i></div>
-                       @endif
                        </a>

動作確認

▼メールアドレスを変更した直後の表示。認証ができていなくても、アカウント削除とメールアドレス変更は利用可能。
Laravel-MustVerifyEmail-05.png

▼認証済ユーザーが、同じメールアドレスで変更処理した場合、特に処理せず完了メッセージ表示。
Laravel-MustVerifyEmail-06.png

参考サイト

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

【laravel-admin】 インストール&画面作成まで 編

こんにちは。バックエンドエンジニアの佐和です。
案件でしばらくlaravel-adminという管理画面を作成するためのライブラリを使っていたので、調べたことやつまづいたところも含めて少しずつ書き起こそうと思います。

まずはインストール編です。簡単に管理画面を確認できるところまで見ていきたいと思います。

laravel-adminとは

laravelで簡単にDBの管理画面を作成することができるライブラリです。

ドキュメントやデモサイトなど使用するために必要な資料が充実しており、難しいカスタムを行う必要がなければものすごく簡単に管理画面が構築できます。

Laravel-admin(ドキュメント)
GitHubページ

基本的な使用方法は上記でカバーし、カスタマイズして使用したい際には直接ソースコードを読んで適宜書き換えていく形になります。
主観ですが、コード内のコメントも(おそらく書き換える前提の部分は)丁寧に書かれているので、しっかり読み解けば問題ないかと思います。

プロジェクトの作成

既に開発しているlaravelプロジェクトに追加する場合は、この章は飛ばしてもらって大丈夫です。

何もないところからlaravel-adminを試したい方は、まずlaravelプロジェクトを作成するところから始めましょう。
公式によると、現在のバージョンでは以下の環境が推奨されるようです。

  • PHP 7+
  • laravel 5.5+

This package requires PHP 7+ and Laravel 5.5, for old versions please refer to 1.4
laravel-admin install

$ composer create-project --prefer-dist "laravel/laravel=5.5.*" <project-name>

DBも必要になってくるので、.envにDBの情報も書き足しておきましょう。

インストール

laravelの準備ができたら早速laravel-adminをインストールします。

$composer require encore/laravel-admin

インストールが終わったら下記コマンドを実行します。

$php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
$php artisan admin:install

これらを実行すると、app/Adminディレクトリが作られます。これからの実装はこのディレクトリ配下で行うことになります。
ファイルの初期配置は以下。

app/Admin
├── Controllers
│   ├── ExampleController.php
│   └── HomeController.php
├── bootstrap.php
└── routes.php

フロント周りのファイルは/public/packages/adminに置かれています。
構成ファイルはconfig/admin.phpです。後々触ることになります。

ここまでで既にダッシュボードは作成されているので、php artisan serveなどをして、http://localhost:8000/admin にアクセスしてみましょう。
ID・PASSどちらにもadminと入力し、無事ダッシュボードが表示されれば成功です。

早速DBテーブルの管理画面を作成していきましょう。

モデル・コントローラ作成

laravelでDBテーブルを認識するためにモデルを作成します。

$php artisan make:model Recipe

モデルが作成されたのを確認したら、それを利用してAdmin用のコントローラを作成します。

$php artisan admin:make RecipeController --model=App\\Recipe

成功すると、作成したコントローラのルーティング情報がターミナルに出力されます。
これをapp/Admin/routes.phpに記述しましょう。

$router->resource('admin/recipes', RecipeController::class);

上記ルーティング情報のURLを叩くと、それらしい画面が表示されていると思います。
あとは作成したAdmin用のコントローラを、ドキュメントを参考にしながら更新していく流れになります。

現在仕様として提供されているのは以下のページです。

  • 一覧画面(grid関数)
  • 詳細画面(show関数)
  • 新規作成・編集画面(form関数)

それぞれドキュメントに基本の使用方法からカスタマイズ方法まで乗っていますので、一通り目を通すことをお勧めします。

まとめ

とても簡単に導入できるので、気になっている方は一度試して見ると面白いかも知れません。
その他、主にカスタマイズ部分でつまづくことが多かったので、少しずつ記事にして行こうかと思います。

参考

Laravel-admin(ドキュメント)
laravel-admin(GitHub)

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

【Laravelで個人開発】ユーザー認証系の機能を導入する

はじめに

このドキュメントは、Laravel初心者の方が、ユーザー登録、ログインを必要とするサービスを作るために、Laravelから標準的に提供されているパッケージを用いてサクッと実装することをゴールに定め書いています。

ゴールの具体的な状態

  • 以下の機能を提供できる
    • 会員登録
    • ログイン/ログアウト
    • パスワードリマインダー
  • 上記機能における各種メッセージが日本語で提供される

インストールするソフトウェア・パッケージ

今回は、laravel/uiを導入するのみです。最新のバージョンは2.xですが、今回インストールしたLaravelのバージョンは6.xなので、1.xを指定してインストールします。

導入手順

vesselを用いた環境で作業を進めます。

1. laravel/uiのインストール

./vessel comp require laravel/ui "^1.0" --dev

2. 認証機能のセットアップ

# 認証用のスキャフォールド生成
./vessel art ui vue --auth

# マイグレーション
./vessel art migrate

3. ローカライズ設定

config/app.php
# タイムゾーンを以下の値に変更
'timezone' => 'Asia/Tokyo',

# ロケールを以下の値に変更
'locale' => 'ja',

# fakerロケールを以下の値に変更(テストデータを作るときに必須の設定)
'faker_locale' => 'ja_JP',

4. 言語ファイルの追加

プロジェクトのルートディレクトリに移動して以下を実行します。成功すれば、 resources/lang/ja というディレクトリが新たに作成されています。

php -r "copy('https://readouble.com/laravel/6.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"

7. テストデータのセットアップ

下記のファイルのコメントアウトを解除し、UserTableSeederを作リます。これにより、認証用のユーザーテーブルに、テストデータを作成することができるようになります。

databese/seeds/DatabaseSeeder.php
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
        $this->call(UsersTableSeeder::class);
    }

以下は内容をそのままコピペします。

databese/seeds/UsersTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\User::class, 30)->create();
    }
}

新しいクラスを追加したのでdump-autoloadを実行する

./vessel comp dump-autoload

7. テストデータを作成する

seedコマンドで、usersテーブルにテストデータを作成します。

./vessel art db:seed

# mysqlコンテナにアクセスする
./vessel mysql

# usersテーブルをカウントする(30件入っているはず)
select count(*) from users;

8. 画面を確認する

localhostにアクセスするとトップページに認証用のメニューが追加されています。
Laravel.png

また、そのメニューからログイン画面に遷移し、適当な文字列を入力してログインを試みると、日本語でエラーメッセージが出力されます。
validate.png

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

【Laravel】migrationで複数テーブルの共通カラム定義を1か所に共通化する方法

はじめに

複数のテーブルに同じカラムを持たせるとき、
migrationでテーブル1つ1つに同じカラム定義を記述するのは面倒です。

例えば、よく使われるのは
created_at、created_by、updated_at、updated_by、deleted_at、deleted_byなどです。

普通にやると各テーブルごとに上記カラム定義を記述することになりますね。

    public function up()
    {
        Schema::create('foo_table', function (Blueprint $table) {
            $table->id();

            $table->timestamp('created_at')->nullable();
            $table->unsignedBigInteger('created_by')->nullable();
            $table->timestamp('updated_at')->nullable();
            $table->unsignedBigInteger('updated_by')->nullable();
            $table->timestamp('deleted_at')->nullable();
            $table->unsignedBigInteger('deleted_by')->nullable();
        });

        Schema::create('bar_table', function (Blueprint $table) {
            $table->id();

            $table->timestamp('created_at')->nullable();
            $table->unsignedBigInteger('created_by')->nullable();
            $table->timestamp('updated_at')->nullable();
            $table->unsignedBigInteger('updated_by')->nullable();
            $table->timestamp('deleted_at')->nullable();
            $table->unsignedBigInteger('deleted_by')->nullable();
        });

        Schema::create('baz_table', function (Blueprint $table) {
            $table->id();

            $table->timestamp('created_at')->nullable();
            $table->unsignedBigInteger('created_by')->nullable();
            $table->timestamp('updated_at')->nullable();
            $table->unsignedBigInteger('updated_by')->nullable();
            $table->timestamp('deleted_at')->nullable();
            $table->unsignedBigInteger('deleted_by')->nullable();
        });
    }

※Laravelは$table->timestamps();という機能を提供しており、created_atとupdated_atだけは共通で定義可能です

このように全テーブルに毎回共通カラム定義を羅列するのは面倒です。
共通コード1か所だけにそのカラム定義を記述し、
migrationではそれを利用するだけの形が望ましいです。
こんなイメージ。

    public function up()
    {
        Schema::create('foo_table', function (Blueprint $table) {
            $table->id();

            $table->systemColumns(); // 共通カラム定義
        });

        Schema::create('bar_table', function (Blueprint $table) {
            $table->id();

            $table->systemColumns(); // 共通カラム定義
        });

        Schema::create('baz_table', function (Blueprint $table) {
            $table->id();

            $table->systemColumns(); // 共通カラム定義
        });
    }

$table->systemColumns();を呼ぶだけで6つの共通カラムが定義できる状態です。

Laravelではmacroという機能を利用してBlueprintクラスを拡張することで
いい感じにできるので、今回はその方法を紹介します。

macroとは

macroとは、Laravelフレームワーク自体が提供しているクラスに
好きなメソッドを追加することができる機能です。

例えば、
Requestクラスにユーザーエージェントを判定するメソッドを追加してみたり、
Carbonクラスに特定のフォーマットに変換するメソッドを追加してみたり、
Laravelのクラスに自由にメソッドを追加できます。

macroの詳しい使い方や
macro利用可能なクラスなどについては
こちらの記事が非常にわかりやすく解説していますのでご参考に。

今回は、migrationで利用されている
Blueprintクラスにこのmacroで機能追加することによって
共通カラムのコード共通化を行います。

Blueprintにmacro追加

まずはBlueprintのmacroを定義するために
サービスプロバイダを新しく作ります。

makeコマンド実行。

php artisan make:provider BlueprintServiceProvider

すると下記のようにBlueprintServiceProviderのクラスが生成されます。

app/Providers/BlueprintServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\ServiceProvider;

class BlueprintServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

このbootメソッドに、macro定義を記述します。

app/Providers/BlueprintServiceProvider.php
    public function boot()
    {
        Blueprint::macro('systemColumns', function () {
            $this->timestamp('created_at')->nullable();
            $this->unsignedBigInteger('created_by')->nullable();
            $this->timestamp('updated_at')->nullable();
            $this->unsignedBigInteger('updated_by')->nullable();
            $this->timestamp('deleted_at')->nullable();
            $this->unsignedBigInteger('deleted_by')->nullable();
        });
    }

これでBlueprintクラスにsystemColumnsというメソッドが追加されました。

このサービスプロバイダを有効にするため、
config/app.phpに登録します。

config/app.php
'providers' => [
    // 中略
    App\Providers\BlueprintServiceProvider::class,
];

これでBulueprintへのmacro定義完了です。

migrationでmacroを利用

あとは、冒頭で見せたように、
migrationでこのmacroを呼び出すだけです。

    public function up()
    {
        Schema::create('foo_table', function (Blueprint $table) {
            $table->id();

            $table->systemColumns(); // 共通カラム定義
        });

        Schema::create('bar_table', function (Blueprint $table) {
            $table->id();

            $table->systemColumns(); // 共通カラム定義
        });

        Schema::create('baz_table', function (Blueprint $table) {
            $table->id();

            $table->systemColumns(); // 共通カラム定義
        });
    }

migrationでは$table->systemColumns();と書いているだけですが、
内部的には先ほど定義したmacroのsystemColumnsメソッドが呼び出されていて
created_at、created_by、updated_at、updated_by、deleted_at、deleted_by
の6つのカラムを定義してくれています。

参考

https://public-constructor.com/laravel-add-method-to-collection-or-facade/

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

【Laravel】日本語で指定されたFakerから英語のFakerを使う

はじめに

モデルファクトリをつかってテスト用のデータを生成する際、氏名は日本語でFakerを使いたい、でもIDとかは英語で使いたい・・・ってなった時に、コンフィグで日本語設定をしつつ、使いたいときだけ英語のFakerを使う方法です。

標準言語設定

app.php
    /*
    |--------------------------------------------------------------------------
    | Faker Locale
    |--------------------------------------------------------------------------
    |
    | This locale will be used by the Faker PHP library when generating fake
    | data for your database seeds. For example, this will be used to get
    | localized telephone numbers, street address information and more.
    |
    */
    'faker_locale' => 'ja_JP',

この状態でFakerを使うとこんな感じなる。

Factory.php
$factory->defineAs(User::class, 'user', function (Faker $faker) {
    return [
        'login_id'     => $faker->unique()->firstName . '_' . $faker->unique()->lastName,
         //例)山口_真綾
        'firstname'    => $faker->firstName, 
         // 例)津田
        'lastname'     => $faker->lastName, 
          //例)裕樹
    ];
});


氏名はいいけどlogin_idは英語にしたい時

Factory.php
$factory->defineAs(User::class, 'user', function (Faker $faker) {
    $faker_en = \Faker\Factory::create('en_US');
    return [
        'login_id'     => $faker_en->unique()->firstName . '_' . $faker_en->unique()->lastName,
     //例)Brannon_Donnelly
        'firstname'    => $faker->firstName,
         // 例)津田
        'lastname'     => $faker->lastName,
          //例)裕樹
    ];
});

configはデフォルトの言語を設定してくれるだけなので、他言語を使うときはfaker オブジェクトをインスタンス化する際に引数に指定するだけでよかった。

調べてみて

Laravelにデフォルトでついている機能なだけあって、他にも簡単に設定ができて柔軟に対応できる機能が沢山あった。
ただLogin_idの値とfirstname,lastnameでの値が変わってくるのはどうしようもないのか・・・。
テストでのみ使うと割り切ればいいのかな。

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