スポンサーリンク

Laravel8入門、LaravelGenerator、CoreUI、既存テーブルからCRUD自動生成(CakePHPのBakeっぽくしたい)

XAMPP

これまでCakePHPで開発していましたが、久々にLaravelもいじろうかと思います。
DB管理画面や業務アプリでは複雑なモデルやルーティングは不要なので、CakePHPの方が圧倒的に早く開発が進みますが、SNSやマッチング系だとLaravelの柔軟性が必要になるかと思います。

ただ、CakePHPに慣れているとbakeコマンドの爆速開発が当たり前になっていて、Laravelでいちいちルーティング書いたり、コントローラをゼロから書くのが面倒になります。
そんなわけで、bakeに近い開発環境をつくるべく準備したときのメモです。

スポンサーリンク

Laravel8 インストール

まずは、Laravel8本体をインストールします。
当方環境は複数のXAMPPを併用しており設定変更しているので、読替が必要です。(下記のように変更して使っています)
・インストール先: C:XAMPP → C:XAMPP64p
・Apache ポート: 80番 → 84番(localhost:84)
・MariaDBポート: 3306番 → 3307番

また、Laravel8では認証画面の自動生成にJetStreamを使うようになっていますが、今回は旧来のLaravelUIを使います。

パッケージのインストール

★コマンドプロンプトでApacheの公開用ドキュメントルートへ移動
# cd C:\xampp64p\htdocs

★composerでインストール。プロジェクト名「lara8_02」は任意
# composer create-project laravel/laravel=8.* --prefer-dist lara8_02

★Zip圧縮されていない生ソースをDLする場合は下記いずれかの書き方(遅い)
# composer create-project laravel/laravel=8.* --prefer-source lara8_02
# composer create-project laravel/laravel=8.* lara8_02


・『laravel/laravel=8.*』バージョン8系の最新版をインストール
→バージョン指定する場合は『=8.5.1(8.5.1固定)』や『=8.5.*(8.5系の中で最新)』など

・『--prefer-dist』 zipでダウンロードする。(早い)
→非圧縮ソースでDLする場合は記述しない。明示的には『--prefer-source』(遅い)

ブラウザで確認

・XAMPPやDOCKERの環境によりアクセス先は異なる。
・Laravelの公開用URLは『ドメイン/プロジェクト名/public』になっている。

http://localhost:84/lara8_02/public/

Laravelのバージョン確認

★作成したプロジェクトのディレクトリに移動
# cd lara8_02

★パッケージのバージョン確認
# php artisan --version



今回は8.20.1がインストールされました。

スポンサーリンク

データベース設定

新しくデータベースを作成して、プロジェクトからアクセスできるようにする。

MySQL/MariaDBの新規作成

PhpMyAdminでも何でもお好きな方法で。自分はGUIが素晴らしいHeidiSQLでやってます。

照合順序は検索の用途や速さに次の3つのうちどれかにしてます。
自分でよく使うのは3番の『utf8mb4_unicode_ci』ですが、要件によって変えます。

1)utf8mb4_bin(マッチしにくいが早い)
→英字大小文字:区別する
→全角半角:区別する

2)utf8mb4_general_ci(アルファベットだけマッチ、ふつう)
→大文字・小文字、全角・半角、全て区別する、早い
→英字大小文字:区別せずにマッチ
→全角半角:区別する

3)utf8mb4_unicode_ci(全角半角なども含めてマッチする、少し遅い)
→英字大小文字:区別せずにマッチ
→全角半角:区別せずにマッチ
※全角『ABC』で検索→(全角)ABC、(全角)abc、(半角)ABC、(半角)abc が全てマッチ
※全角『あいう』で検索→(全角)あいう、(全角)アイウ、(半角)アイウ、(半角小文字)ァィゥ が全てマッチ

envファイルの設定


>>> [ファイルの場所]C:\xampp64p\htdocs\lara8_02\.env
>>> [注意] 普通はC:\xampp\htdocs\lara8_02\.env になると思います。
APP_NAME=MyLaravelProject02 //好きなプジェクト名
APP_URL=http://localhost:84/lara8_02/public //
DB_PORT=3307 //環境に合わせて変更。通常は3306のままでOK
DB_DATABASE=lara8_02 //先ほど作成したDB名
DB_USERNAME=root //環境に合わせて書き換え
DB_PASSWORD=

アプリケーション設定の編集

[ファイルの場所]C:\xampp64p\htdocs\lara8_02\config\app.php


 'timezone' => 'Asia/Tokyo', //'UTC'から変更
 'locale' => 'ja', //'en'から変更
 'fallback_locale' => 'ja',//'en'から変更
 'faker_locale' => 'ja_JP', //'en_US'から変更

infyom Laravel-Generatorのインストール

開発の補助にinfyomのツール類、管理画面テンプレートをインストールします。
原文のインストール手順はこちら
https://www.infyom.com/open-source/laravelgenerator/docs/8.0/installation

composer.jsonの追記&インストール

[場所]C:\xampp64p\htdocs\lara8_02\composer.json


"require": {
  "php": "^7.3|^8.0",
  "fideloper/proxy": "^4.4",
  "fruitcake/laravel-cors": "^2.0",
  "guzzlehttp/guzzle": "^7.0.1",
  "laravel/framework": "^8.12",
  "laravel/tinker": "^2.5",
  //★以下3行+1行(管理画面デザイン用)を追記(なお、jsonはコメントNGなのでコメント行は削除して下さい)
  "infyomlabs/laravel-generator": "8.0.x-dev",
  "laravelcollective/html": "^6.2",
  "doctrine/dbal": "~2.3",
  //★管理画面デザインにadminLTEを使う場合
  "infyomlabs/adminlte-templates": "^1.0"
  //★管理画面デザインにCoreUIを使う場合
  "infyomlabs/coreui-templates": "8.0.x-dev"
},

上記のjsonを保存したらコマンドプロンプトで『composer update』

なお、管理画面UIは新しくStislaテンプレートも使えるようになった模様。
compose.jsonの書き方はこちら

Laravel-Generator用にエイリアスの追加

[場所]C:\xampp64p\htdocs\lara8_02\config\app.php


'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
:
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
//InfyOm追加
'Form'      => Collective\Html\FormFacade::class,
'Html'      => Collective\Html\HtmlFacade::class,
'Flash'     => Laracasts\Flash\Flash::class,

Laravel-Generator用の設定ファイル生成


# php artisan vendor:publish --provider="InfyOm\Generator\InfyOmGeneratorServiceProvider"

これで『laravel_generator.php』という設定ファイルが生成されます。
[場所]C:\xampp64p\htdocs\lara8_02\config\infyom\laravel_generator.php

※もし、使用する管理画面テンプレートをCoreUIにした場合は下記の変更が必要


//'templates' => 'adminlte-templates', //adminLTEの場合
'templates' => 'coreui-templates', //CoreUIにした場合

Laravel-Generator用にルーティングプロバイダの設定変更

[場所]C:\xampp64p\htdocs\lara8_02\app\Providers\RouteServiceProvider.php


/*   Route::prefix('api')
->middleware('api')
->gtnamespace($this->namespace)
->gtgroup(base_path('routes/api.php'));
*/
//InfyOm仕様に変更
Route::prefix('api')
->middleware('api')
->as('api.')
->namespace($this->app->getNamespace().'Http\Controllers\API')
->group(base_path('routes/api.php'));

ここでは、APIのルーティングを、Web側の名前付きルートを分離するメソッドとして追加しました。
APIコントローラーを、別の名前空間を持つ、別ディレクトリに保存する事ができます。

Laravel-Generator用の基本ファイルを自動生成

# php artisan infyom:publish


ファイルとフォルダが新しく生成されます。
これらはGeneratorで自動生成するための基本ファイルになります。

ログイン画面を自動生成する

Laravel UIをインストール

LaravelUIは、モダンフロントエンドフレームワーク(Vue、React等)をLaravelで使う事ができるライブラリで、Ver5まではデフォルトで搭載されており、ver6以降は別途インストールが必要になったとの事です。フロントエンドフレームワークは入れ替わりも激しいので別途好きなのを使ってよ、という扱いなのかもしれませんね。


# composer require laravel/ui:^3.0

これで、artisan こまんどに、『ui』が追加されます。


# php artisan
 :沢山のコマンド
 ui
  ui:auth ログイン画面用のView、Routs、Controllerを自動生成する
  ui:controllers 認証済みで使用できるContorollerを自動生成する

これで『 artisan ui bootstrap/vue/react –auth』で認証用のファイルが生成されます。
※bootstrap/vue/reactの中から1つ選びます

認証画面の自動生成

今回使用する管理画面テンプレート『CoreUI』はBootstrapベースとの事なので、認証画面もBootstrapで生成します。


# php artisan ui bootstrap --auth

ここで、ログイン画面用のブレードビューファイルと、コントローラー、レイアウトファイルが生成されます。

試しにブラウザで新規ユーザ登録画面を見てます。
>>http://localhost:84/lara8_02/public/register

ブラウザのHOME画面にはLOGINが表示されますが、まだCSSが適用されていない状態です。

またコマンドプロンプトには、『npm install && npm run dev』と表示されています。
通常ならここでnpmコマンドでbootstrap用のcss,jsに適用させるのですが、
ここではデザイン済みのレイアウトファイル一式をInfyOm Laravel Generatorのものに上書きします。

次のジェネレーターのコマンドを実行して、laravel / uiパッケージによって生成されたデフォルトの認証ファイルを全て上書きしていきます。


# php artisan infyom.publish:layout --localized
 C:\xampp64p\htdocs\lara8_02\resources\views/layouts/app.blade.php already exists. Do you want to overwrite it? [y|N] (yes/no) [no]:
>y

いくつかのファイルを上書きしますか?と聞かれるので全て『y(yes)』にして進めます。
完了したら、ブラウザで先ほどの画面をリロードすると、変更されています。
なお、『‐‐localized』オプションは、多言語化設定なので、日本語ハードコーディングでOKなら付けなくてOKです。
>>>http://localhost:84/lara8_02/public/register

文言が英語のままなので、日本語ファイルを追加していきます。

多言語化翻訳ファイルの作成

先ほどのレイアウトファイルの生成で『–localized』を付けた場合は多言語フォルダができるので、日本語のファイルを作成します
[場所]C:\xampp64p\htdocs\lara8_02\resources\lang\en
  ↓新しく『ja』フォルダを作成する
[場所]C:\xampp64p\htdocs\lara8_02\resources\lang\ja

とりあえずはログイン画面用だけ『auth.php』ファイルを作ります。
[場所]C:\xampp64p\htdocs\lara8_02\resources\lang\ja\auth.php
実際のブレードファイルと、翻訳ファイルの関連づけは下記のようになっています。


'メールアドレス、もしくはパスワードが違います',
'throttle' => 'ログイン試行回数がしきい値を超えました。 時間をおいてログインしてください。',
'login' => 'ログインしました',
'logout' => 'ログアウトしました',
'notVerified' => 'メールが認証されていないようです。',
'verified' => 'メール認証に成功しました',
'alreadyVerified' => '既に認証されているアドレスです',
'sendVerifyMail' => '認証メールを再送しました',
'noUser' => '入力されたメールアドレスのユーザーが存在しません',
'email' => 'メールアドレス',
'password' => 'パスワード',
'confirm_password' => 'パスワードを確認',
'sign_in' => 'ログイン',
'admin_sign_in' => '管理者ログイン',
'sign_out' => 'ログアウト',
'register' => 'ユーザー登録',
'login' => [
'forgot_password' => 'パスワードを忘れた方へ',
'title' => 'ログインID/パスワードを入力',

],
'forgot_password' => [
'send_pwd_reset' => 'パスワード変更リンクを送る',
],

'reset_password' => [
'title' => 'パスワードを変更',
'enter_email' => 'メールアドレスを入力してください'
],
'registration' => [
'title' => 'こちらから新規登録できます。',
'have_membership' => '既にアカウントを持っている方はこちら'
]

];


DBにユーザー用のテーブルを作成

画面の次にDBにテーブルを作成します。既に前段の自動生成でテーブル作成用のマイグレーションファイルは作成済みです。
\database\migrations\に3つできていると思います
 ・2014_10_12_000000_create_users_table.php
 ・2014_10_12_100000_create_password_resets_table.php
 ・2019_08_19_000000_create_failed_jobs_table.php

このままマイグレーションを実行します。


# php artisan migrate

生成が完了したらDBを確認してみます。

これでユーザー登録や認証ができるようになりました。

CRUDの自動生成(Laravelで既存Tableから直接bakeしたい)

ここからCRUDを作ります。通常、infyom:scaffold で画面を自動生成する場合は、Modelとカラムの定義をそれぞれコマンドラインに全て手入力していきます。

# php artisan infyom:scaffold 作成したいモデル名

このコマンドの後に、カラムの定義とバリデーションを1つずつ入力していきます。
詳しい設定方法は本家サイトで確認するか、qiitaのこちらが参考になります。

自分の場合は設計はER図から入るので、ER図からテーブル定義は自動生成できます。
なので、わざわざ手入力するのは面倒です!
 
そう、やりたいのはCakePHPの『bake all』です。特に自分は既存テーブルからCRUDを自動生成したいです。
こんなこと言うと怒られますが、当方の規模ではmigrationファイルによるテーブル定義のバージョン管理は不要です。

ER図からTableを作る

というわけで、毎度おなじみA5SQL-Mk2でER図からテーブル定義を自動生成し、HeidiSQLでテーブル作成してしまいます。

既存テーブルからCRUDを自動生成する

InfyOmのLaravelGeneratorは、既存テーブルからCRUDが作れます。

# php artisan infyom:scaffold $MODEL_NAME --fromTable --tableName=$TABLE_NAME

$MODEL_NAME:作成するモデル名、単数形、先頭大文字(例:Product、Maker)
$TABLE_NAME:使用するテーブル、複数形、(例:products、makers
モデル名とテーブルを別の名前に設定する事もできます。

というわけで、『makers』と『products』テーブルからCRUDを作成します。

# php artisan infyom:scaffold Maker --fromTable --tableName=makers
・・・いろいろ作成されます

# php artisan infyom:scaffold Product --fromTable --tableName=products
・・・いろいろ作成されます


これで、ユーザーアカウントを作成して、ログインしてみると下記のようにMakerとProductが作成されています。

ただし、cakePHPのように自動でリレーションを張ってmaker_idの入力をリスト化なんてことはしてくれないようで。。。そこは自前で書かなくてはいけません。

※β版機能としてリレーション検出もあるようなので、調べてみようとも思います。
https://www.infyom.com/open-source/laravelgenerator/docs/8.0/relationships#from-table

とりあえずこれで、bakeっぽくプロジェクト初期のプロトタイピングが始められます。