Laravelでテストデータをデータベースに入れてみる
テストデータについては、Excel等でデータ作成してphpMyAdminからインサートする形で十分かなと思ってましたが、FakerPHPというダミーデータを生成するPHPライブラリを使うと簡単にダミーデータが作れるようなので、今後のことも考え使ってみたいと思います。
0. イントロダクション
FakerPHPはLaravelでは標準で入ってますので、インストール不要です。小生はインストールしようとしてました・・・。
FakerPHPだけでは、指定した、ダミー値を返すクラスですので、大量のデータを生成してDBにインサートすることはできません。
Laravelではモデルファクトリクラスに必要なFakerのプロパティーやメソッドを記述し、シーディングクラスでモデルファクトリで定義したデータを指定数生成し、データベースにインサートします。
ではこのプロセスを順を追ってみてみましょう。
1. Fakerのロケールを日本にする
なんと、Fakerで生成されるデータは日本語にもできるようで、"config/app.php"の"faker_locale"を以下のように変更するだけでいいようです。
'faker_locale' => 'ja_JP',
2. モデルファクトリクラスファイルの作成
Customerテーブルにダミーデータをインサートしますので、Customerモデルのモデルファクトリファイルを作成する形になります。モデルファクトリクラスは以下のようにArtisanで作成できます。
#php artisan make:factory CustomerFactory
ファクトリ名の頭をデータベースのモデル名にしとくと、ファイル内のモデル名等もそれに合わせてくれるようです。
作成したファクトリに生成するダミー値を以下のようにdefinition関数に記述をします。
public function definition() { return [ 'customer_id' => $this->faker->numberBetween(1000000000,2147483647), 'customer_nm' => $this->faker->company, 'customer_addr' => $this->faker->streetAddress, 'customer_tel' => $this->faker->phoneNumber, 'customer_fax' => $this->faker->phoneNumber, 'status' => 1, ]; }
fakerを使うと上記のようにいろいろなダミー値が作成できます。ほかにもいろいろとバリエーションがありますので、ググってみてください。"status"は変動させる必要ありませんので固定値にしてます。
3. シーディングファイルを作成する
シーディングファイルは以下Artisanで作成することができます。
#php artisan make:seeder CustomerSeeder
作成したシーディングファイルのrun関数に以下を記述をします。
\App\Models\Customer::factory()->count(50)->create();
上記では、データが50レコード作成されます。
4. ダミーデータを生成する。
最後に以下Aritsanでダミーデータがデータベースにインサートされます。
#php artisan db:seed --class=CustomerSeeder
5. まとめ
今回、あまり複雑な手順は取りませんでしたが、結構つかえそうです。しかしFakerどんな仕組みになっているのでしょうね。こういうの考える人すごいと思います。
TypeScriptは勉強すべきか
Reactを勉強していると、TypeScriptに関する情報がよくはいってくる。
TypeScriptはマイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語で、ECMAScript 2015の厳密な上位互換らしいです。
やっぱマイクロソフトはすごいよ。
ES6を勉強しているところなのだが、TypeScriptはいろいろ利点もあり、主流となるならば、やっぱ覚えたほうがいいのかなーと思う今日この頃です。
Reactで作られたフリーのコンポーネントを業務で利用できないか、いろいろあさっているのですが、結構、TypeScriptベースで記述されているものがいがいに多いことに驚かされてます。
経験則上なのですが、これからjavascriptをがっつり業務で使いたい方はTypeScript勉強しといたほうがいいかもしれないですね。
LaravelでReactのサンプルプログラムを表示させてみる
新しいプログラミングに触れるには、まず実行環境を作ってサンプルを動かしてみることである。 今回は実際にLaravelでReactの実行環境を作りReactのサンプルを動かしてみます。
0. 実行環境を構築してみる
LaravelでReact環境構築するのは、以下に掲載してますので、参考にしてください。
pgslit.hatenablog.com pgslit.hatenablog.com
1. ReactサンプルプログラムのJavaScriptファイルを作成する
今回は、以下Reactの公式ページの時計のサンプルプログラムを表示させてみます。 ja.reactjs.org
まずプロジェクトフォルダ内の”resources\js\components”に"TestReact.js"というファイルを作成します。
その中に公式ページの以下、時計のサンプルプログラムをコピーし保存します。
import React from 'react'; import ReactDOM from 'react-dom'; class Clock extends React.Component { constructor(props) { super(props); this.state = {date: new Date()}; } componentDidMount() { this.timerID = setInterval( () => this.tick(), 1000 ); } componentWillUnmount() { clearInterval(this.timerID); } tick() { this.setState({ date: new Date() }); } render() { return ( <div> <h1>Hello, world!</h1> <h2>It is {this.state.date.toLocaleTimeString()}.</h2> </div> ); } } ReactDOM.render( <Clock />, document.getElementById('root') );
2. "app.js"に作成したReactファイルを記述する
"resources\js\app.js"に以下を追記してください。 ※Exampleの行はコメントアウトしといてください。バッティングするといろいろ面倒なので。
//require('./components/Example'); require('./components/TestReact.js');
ReactのソースはBabelでコンパイルされ”public\js\app.js”に書き込まれますが、Laravelの初期設定では、"resources\js\app.js"に記述したソースがコンパイル対象となっています。
3. Reactのソースをコンパイルする
コンパイルはシェルで以下のようにタイプすればコンパイルできます。
#npm run dev
もしくは
#npm run watch
上のほうが、ソースを更新するたびにコンパイルしてくれるので便利です。ただし、ずっと実行させておく形となりますので、この辺は好みになるのかなー
4. Bladeファイルを編集する
最後に、"home.blade.php"を編集します。card-body内に以下を記載すればOKです。
<div id="root"></div>
これで、完了となります。サーバーを起動して、ホーム画面にアクセスしてみてください。問題なければ時計が表示されるはずです。
上記のように、ReactDOMで、Bladeファイルにコンポーネント感覚で、組み込めるのでいいですね。
5. まとめ
サンプルプログラムが表示できると、なんだか、安心感がでてきますね。サンプルプログラムをいろいろいじって、引き続き勉強していきたいと思います。
Reactを知る
ReactについてはLaravelのカテゴリーで適当に扱おうと思ってましたが、煩雑になりそうだったので独立したカテゴリーにすることにしました。
今、Reactも勉強中なのですが、Reactについて学ぼうと、公式ページのチュートリアルからやり始めました。しかしながら、オッサンの頭ではなかなかReactについて身になっていく感じがしませんでした。
こういう時はたいていの場合、段取りをスキップしすぎているときです。チュートリアルから始めるといい場合もありますが、私にとっては飛ばしすぎだと思いました。
そこで、Reactってそもそもな何なのかというところから、見ていこうと思います。
Reactって何?
wikiによれば"Facebookとコミュニティによって開発されているユーザインタフェース構築のためのJavaScriptライブラリ"らしい、なるほどこういうのを聞くとすごく親近感がわくし、人気がでるのもなんとなくわかりますね。
Reactの使うメリットとは?
いろいろとメリットはありますが、小生的には公式ページに記載されている"アプリケーションの各状態に対応するシンプルな View を設計するだけで、React はデータの変更を検知し、関連するコンポーネントだけを効率的に更新、描画します。"というところが一番の肝だと思ってます。
私が、Reactを使うとしたら、ここが生かせるアプリケーション開発に使いたいですね。
Reactの文法はJavaScriptなのか?
ReactはJavaScriptですが、ECMAScript 2015(ES6)というJavaScript規格とJSXというJavaScriptの構文の拡張によりコーディングしていく形となります。
ここが重要で、ここをすっ飛ばしてReactのチュートリアルやっていて、まったく頭にはいってきませんでした。
特に、ES6に関する勉強はある程度しといたほうがいいです。Reactの公式ページにも一応、解説されてますが、ES6の基礎ないと私にはきつかったです。
JavaScriptに規格があることは知っていたのですが、Reactやるまでほとんど意識することはありませんでした。基本的に現在のブラウザでサポートされているJavaScriptの規格はES5でReactはES6規格で記述したJavaScriptをBabelという下位のJavaScript構文に変換するトランスコンパイラを用いて変換しこの変換されたJavaScriptを利用するイメージです。尚、JSXはBabel標準では変換できないので、JSXも変換できるプラグインを含んだBabelを利用します。
しかし、ES5に慣れすぎていて、ES6のコーディングをミスることが多いです。先入観というかなんというか、まだまだ先は長そうです。
普段からES5やJqueryに慣れている人はES6で新しくなった構文をよく理解しておくことをお勧めします。
次回からLaravelでReactを扱うための手順等、学んでいきたいと思います。Laravel使うことはお許しください。Reactメインで業務システム構築する自身まったくないので・・。
では今日はここまで
バリデーションにカスタマイズルールを適用してみる
前回、新規登録画面にバリデーションをつけました。今回はこのバリデーションにカスタマイズルールを加えてみようと思います。
作成するカスタマイズルール
作成するルールは登録する顧客IDがすでにDBに存在している場合はエラーメッセージを出すようにするものです。DBを参照してチェックすることも割とあるので、今回はこの辺も勉強したいと思います。
カスタマイズルールファイルを作成する
カスタマイズルールはまずカスタマイズルール記述したルールファイルを作成しそのクラスをリクエストファイルのルールに加えることで実装できます。
ルールファイルは以下のようにArtisanで作成できます。
#php artisan make:rule MstCustomerIdRule
ルールのファイル名は"MstCustomerIdRule"としました。
ルールファイルのpassesとmessage関数を以下のように記述します。
public function passes($attribute, $value) { return Customer::where('customer_id', $value)->doesntExist(); } public function message() { return 'すでにこの顧客IDは登録されております。'; }
基本的にpasses関数の中にバリデーションルールを記載します。この関数でfalseを返せば、ルールに違反したということになります。
重複判定については EloquentのdoesntExistで完結な記述にしてみました。非常に楽ですね。
尚、DBを参照しますので、ルールファイルに以下のようにモデルクラスをインポートしておく必要あります。
use App\Models\Customer;
リクエストファイルとの紐づけ
まずリクエストファイルにルールファイルのクラスをインポートするために以下を記述します。
use App\Rules\MstCustomerIdRule;
次にすでに実装したリクエストファイルのルールを以下のように変更します。
'customer_id' => ['required','min:10','max:10',new MstCustomerIdRule]
既存ルールのようにカスタマイズルールクラスのインスタンスを指定します。
注意が必要なのは、既存ルールの場合は配列でなくバリデーションルールを"|"で区切られた形で指定できるのですが、カスタマイズルールクラスのインスタンスは配列でないとエラーになります。最初、少しはまってしましました・・。
以上で実装完了です。
まとめ
カスタマイズルールも比較的容易に実装できました。また、ロジックも汚さず実装できますので、非常にいいですね。