20200924のlaravelに関する記事は11件です。

LaravelでSocialiteで404エラーから抜け出せなかった自分

LaravelでSocialiteで404エラーから抜け出せなかった自分

こんばんは。
LaravelでTwitterやGoogle,GitHub,Facebookなどでログインを実装にはSocialiteが便利です。

環境はLaravel8系でuiを使ってTwitterAPIによる認証を試みました。
リダイレクトした際にどうもエラーが出るんですよね。
XAMPPWを使うと

Object not found!
要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。

サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。
Error 404

こんな感じ。

これの原因解決に2日を要したのですが、結局の所.env内のCALLBACK_URLが

http://localhost/login/twitter/callback

となっていたのが問題みたいです。
Laravelで普通にphp artisan serveするとlocalhost:8000で開かれます。
でも上のURLだと:8000がないんです。なので.env内とTwitterDeveloperの箇所を

http://localhost:8000/login/twitter/callback

こうするとうまくいきます。

こんなちょっとのところに1日以上悩んでしまいました。

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

DBのレコードを維持しつつテストするならDatabaseTransactionsを使おう

結論

DBの値を操作するテストを実行する場合、
既存のDBのレコードはそのままに変更した値だけ元に戻したい!

そんな時はDatabaseTransactionsを使おう?

事例

  • 有用な大量の既存テストデータが存在するDBを使って、レコード追加のテストを行う
  • 普通にテストを実行すると、都度レコードが増えてしまう……?
  • RefreshDatabaseを使ったら、既存のテストデータまで消えた?????

DatabaseTransactions とは

  • テスト実行中のみ有効なトランザクションを設定する
  • 自動的にsetUp()でbeginTransactionして、tearDown()時にrollbackする

解決方法

以下のように、DatabaseTransactionsを使う

class HogeTest extends TestCase
{
    use DatabaseTransactions;

    /**
     * @var HogeService
     */
    private $hogeService;

    /**
     * 初期データ投入.
     */
    public function setUp(): void
    {
        parent::setUp();
        $this->hogeService = app()->make(HogeService::class);
    }

    /**
     * @test
     */
    public function insertRecord_正常()
    {
        $name = 'fuga';
        $no = $this->hogeService->insertRecord($name);
        $this->assertSame(1, $no);
    }
}

補足

  • 自動採番する項目は、レコードに登録されていなくても、
    内部的にはカウントされている点に注意

例)
 既に4回、DatabaseTransactionsを使ったテストを実行していた場合、
 その後DatabaseTransactionsを使わずに新規追加された
 以下のレコードのno(bigIncrements)は1ではなく5になっている

mysql> select no, user_id, created_at from reports;
+----+------+---------------------+
| no | name | created_at          |
+----+------+---------------------+
|  5 | fuga | 2020-09-24 19:14:47 |
+----+------+---------------------+
1 row in set (0.01 sec)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPUnitテスト実行時に「no such table」エラー

結論

PHPUnitテスト実行時に「no such table」エラーが出たら、
テスト接続先DBがインメモリになっていないか設定を確認しよう?

事例

LaravelプロジェクトでPHPUnitテストを実行したら、
以下のエラーが出た。

root@efed49901495:/var/www# vendor/bin/phpunit tests/Unit/HogeServiceTest.php 
PHPUnit 8.5.0 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 868 ms, Memory: 20.00 MB

There was 1 error:

1) Tests\Unit\ReportServiceTest::countHoge_正常
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such table: hoges (SQL: select count(*) as aggregate from "hoges")

原因

テスト接続先DBの設定が、SQLiteのインメモリ機能を使用するようになっていた。

phpunit.xml
    <php>
        (省略)
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
    </php>

Q. テスト接続先DBの設定は.env管理じゃないの?

A. じゃない……です?

Laravelでは環境変数を.envで設定します。
ですが、テスト時の環境変数はphpunit.xml内で指定された値が利用されます。

解決方法

テスト接続先DBの設定を、指定したいDBに合わせて修正。

phpunit.xml
    <php>
        (省略)
        <server name="DB_CONNECTION" value="mysql"/>
        <server name="DB_DATABASE" value="merger"/>
    </php>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel]Carbonで対象の期間が何週間あるか取得する

週別の集計結果を表示する必要があったため忘れないようメモ。

サンプルコード

月初から月末まで何週あるかCarbonで取得。

$start = new Carbon()->firstOfMonth();
$end = new Carbon()->endOfMonth()

getWeekOfNumberInMonth($start, $end);
function getWeekOfNumberInMonth($start, $end) {
    $dt = $start->copy()->firstOfMonth();
    $week = 1;
    for($dt; $end >= $dt; $dt->addDay()) {
        if ($dt->isSunday() && $dt !== $start) $week++;
    }
    return $week;
}

FYI:
既出記事ですが取得ロジックを変えてやってます。
https://qiita.com/fabled/items/2607186731adc75f11e1

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

【2020年版】PhpStormでLaravel案件開発するなら入れておきたいPlugin

2018年に Laravelを使って開発をするときに入れておきたいPhpStormのプラグイン という記事を書きました。
その後、PhpStormバージョンアップと共に必要なくなったプラグインや、新たに登場したものもあるため、2020年バージョンとして改めて書いておきます。

これらを入れた結果、ここまでLaravel案件の開発はラクに書ける!の解説記事(動画?)も後日公開予定です。

前提

PhpStorm のバージョン 2020.2
Laravel v8系

プラグインリスト

PHP編

  • PHP Advanced AutoComplete
    • 入力補完が強くなる
  • PHP Annotations
    • phpdocの補完?
  • Php Inspections (EA Extended)
    • より良いコードの書き方をサジェストしてくれる
  • PHP Unit code coverage
    • コードの左端にテストが通って成功(緑) or 通ったけど失敗(赤) の色がつく
  • PHP Unit Enhancement
    • テストコードの記述を支援してくれる補完機能
  • PHPUnit Helper
    • 上記 PHP Unit Enhancementをforkしたもの
  • PHPStan / Psalm / Generics
    • 静的解析ツールの PHPStan, Psalm を実行できる

Laravel

  • Laravel
    • 設定項目あり
  • Symfony Support
    • LaravelはSymfonyのコンポーネントをたくさん使ってるので一応入れてる
  • Blade
    • Bladeテンプレートを書くときのサポート
    • APIのやり取りしかしない案件だと不要

Git支援系

  • GitExtender
  • GitToolbox
    • Annotation(git blame)を開かなくても、カーソル行のコミット情報が薄く表示される

ターミナル系

  • ANSI Highlighter
  • Awesome Console

周辺技術

  • .env file support
  • BashSupport
  • Swagger
    • OpenAPI ドキュメントを書くときの補完
    • 実際にはVSCodeでpreviewしながら書いたほうがいいかも
  • ledis
    • Redisのクライアント
    • 未使用

IDE全般

  • Japanese Language Pack EAP
    • 日本語化パック UIは英語のままでも問題なかったが、エラーメッセージも日本語になるとわかりやすい
  • OpenGithub
    • 今開いている箇所を GitHubで開いてくれる。GitHubEnterpriseにも対応
  • Open in splitted tab
  • Rainbow Brackets
    • カッコ {} () に色がつく
  • https://plugins.jetbrains.com/plugin/9792-key-promoter-x
    • キーボードショートカットがあるのにマウス操作をすると、ショートカットを教えてくれる
  • IdeaVim
    • Vim風のキーバインドで入力できるようになる
    • キーボードショートカットがIDE独自のものとかぶる物があり、調整が必要
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelDB.com~操作方法と勘所を書いた〜(基本操作編)

◇LaravelDB.com ?

Laravelのデータベース設計(ER図)するだけで、Migrationファイルがポンって作成できるFreeの「 テーブル設計&Migration作成 」 ツールです。

image.png

メイン機能

  • Migrationの自動生成
  • チームメンバーとの共有可能
  • CRUDコード(β版)の自動生成
  • CRUDコード(β版)でのValidation自動生成(テーブル設計に合わせて自動で生成)

利用について

個人/プログラミング学習者: 無料
企業/商用利用:paypal等の寄付・ウイッシュリストでの寄付

用途

用途は開発者によってバラバラですね。
・Migrationのみ使う(ほとんどの人はここですかね)
・CRUDファイル全部(数%くらいの人)
・コード生成後、一部(Validationとか)をコピーして使う(結構な割合でいます)
・テーブル設計の共有(Team開発では使ってるようです)

◇操作方法(マニュアル)

1.テーブル作成

2.カラム作成


※使いやすくするポイント!! 「列を追加」ボタンを連打で必要な数だけ先に作ると便利!!

3.2020-09-24アップデートから使用可能

「 ENUM, UNSIGNED ] に対応、新規プロジェクトより表示されるようになります

以下はENUM、Doubleの入力してる例です。

「 UNIQUE, INDEX ] に対応、新規プロジェクトより表示されるようになります

外部キーの設定

外部キー制約を使用する場合( ※1対他、多対多などを分ける機能は無い)

4.ER図の保存

コントロールパネル[Data:セーブ/ロード]から移動します。

「クラウドに保存」or「ブラウザに保存」を選択できます。

この例では「クラウドに保存」を選択。

Save/Load機能 機能詳細
クラウドへ保存 アカウントに紐づきクラウドに保存します。
クラウドデータ一覧 保存したクラウド側のデータ一覧
ブラウザに保存 使用中のブラウザ「LocalStorage」に一時保存
ブラウザデータ一覧 localStorageに保存したデータ一覧

上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図を復元します。

5.Migrationを生成

[ER図から出力]内のBuild [Migration]ボタンをクリックしてダウンロードします!


Zipファイルを解凍してダウンロードファイルを確認。

【ER図をTeamでシェア】

テーブル設計をシェアする機能のことです。

1 [送信側:シェアData]作成


見せたい相手にIDを渡しておいて、変更があれば「Create a [Share ID]」ボタンを押すと毎度データ更新されることを知っておきましょう!

2 [送信側:シェアData] IDをコピー

ここでコピーしたIDを相手に知らせます。

3 [受信側:シェアData]読み込み

相手は送られてきた[シェアData]IDを貼り付けます。

4 「Read」ボタンをクリックしてデータを受信表示しましょう。

3.シェアデータの複製が完了!!

受信側にデータが入りました!受信側もそのデータを活用できるようになります。
チーム・メンタリング等のケースでも利用可能です。

※受信後は「別名を付けて保存しておくと良いでしょう!」

◇ リバースエンジニアリング(Migration → ER図)

フォルダにMigrationファイル(Schema::createのみ)一式集めZip圧縮したファイルをアップロードすることで、ER図へ変換(リバース)することが可能です。

Migrationファイル一式をZIP圧縮 → [ Reverse >>> ERD ]ボタンでアップロード
アップロード完了するとER図が表示されます。

Migration(ZIPファイルに一式纏めて) 機能詳細
[ Reverse >>> ERD ] Migrationファイル一式をフォルダに入れて、ZIP圧縮したファイルをアップロード

1.注意
以下Migrationファイル 「 Schema::create 」のみ現在は可能
※ Schema::create以外は対応検討中

Schema::create("テーブル名", function (Blueprint $table) {...}

2.注意
「LaravelDB.com」からZIPファイルをダウンロードしたファイルをそのままアップロードは出来ません。必ず、一度解凍したものをZIP圧縮しなおしてuploadしてください。

◇ β版のCRUD/リレーションを使用したい場合(まだまだ開発段階の未知の機能)

<重要>この機能はテーブル名の末尾に「s」が無いとうまく動作しません。
※ENUMは必須・未入力のみ出力。
※intは型・必須・未入力のみ出力、sizeが未対応。
※2020-09-24Migrtion機能にアップデートが入ったので、β版機能に影響があるかもしれません。

  1. まずは、複数のテーブルを簡単に作り「外部キーの接続」をして準備してください!!
    その後、右メニュー「 [Data]セーブ/ロード 」クリックすると以下画面が表示されます。

  2. BUILD [CRUD CODE] をクリック!!CRUD ファイル一式が生成されます

【ポイント】
  • Relation(Beta)にチェックを入れておくとリレーションします。

  • BUILD [MIGRATION] でもリレーション(QueryBuilder)がコメントで生成されますよ。

【このツールでのリレーションのポイント】

  • JOINしてるテーブルの全ての項目を最初は表示します(同項目名が存在する場合、片方のみ表示します)。
  • CRUDのコードが生成されたら、仕様に合わせてHTMLテーブルの項目を削除してください。
  • リレーションは上記画像のように「チェック」を入れないと生成しないようにしています(Beta版のため)。
  • Controller内にコードが生成されてますので、確認しておくと良いでしょう!
  • 外部キーはこのツールでは非推奨としています(理由:Migrationの実行順序が重要でエラーになりやすい為) プロトタイプ(ベースになるコードを生成してくれる)には十分すぎる機能ですね。

◇Validation → テーブル設計に合わせて生成

Validationって地味に面倒ですよね、完璧では内容ですが、少しの手直しで使用できるなら便利そうです!!

例でざっくりテーブルをER図で書いてみました。
以下"t_gsusers"テーブルを中心に見ていきます。

生成されたコントローラーのcreate(),edit()にはこういったvalidationが挿入されます。

TGsusersController
            $this->validate($request, [
                "name" => "required|max:128", //string('name',128)
                "lid" => "required|max:128", //string('lid',128)
                "lpw" => "required|max:128", //string('lpw',128)
                "m_department_id" => "required|integer", //integer('m_department_id')
                "m_position_id" => "required|integer", //integer('m_position_id')
                "m_prefectures_id" => "required|integer", //integer('m_prefectures_id')
                "m_kanri_id" => "required|integer", //integer('m_kanri_id')
                "m_lifeflg_id" => "required|integer", //integer('m_lifeflg_id')
                "m_test_id" => "required|integer", //integer('m_test_id')

            ]);

{{old('name')}} → 入力項目を補完(CRUD:β版を使用した場合に生成されます)

validationで未入力等ではじかれた場合、入力した文字を消さずに表示します。

ベータ版のCRUD/リレーションの利用シーン

上記のようにβ版ではありますが、全てを利用するというよりは、コードを生成して、必要な部分だけ使うのも良いと思います。(実際にそういったケースを耳にしました〜)

◇LaravelDB.com 対応カラム一覧

tinyIncrements
mediumIncrements
smallIncrements
bigIncrements
increments
mediumInteger
smallInteger
bigInteger
tinyInteger
integer
unsignedInteger (2020-09-24対応)
unsignedTinyInteger (2020-09-24対応)
unsignedSmallInteger (2020-09-24対応)
unsignedMediumInteger (2020-09-24対応)
unsignedBigInteger (2020-09-24対応)
decimal
double
float
enum (2020-09-24対応)
geometryCollection
geometry
jsonb
json
char
longText
mediumText
text
multiLineString
lineString
string
multiPoint
multiPolygon
point
polygon
binary
nullableTimestamps
timestamps (2020-09-24対応)
softDeletes (2020-09-24対応)
dateTime
timestamp
time
year
date

◇そもそも、なんで作ったの?

私は学校でプログラミング(サービスを作る基本)を教えていて、テーブル設計している学生がその場にいて
「テーブル設計して、そこからMigrationファイル作成して、コードをイチから書いて・・・」普通の作業ではあるんですが、何故か「その時は疑問を感じました」、ER図書いたらMigrationファイル生成したら便利だよね~。
何割かの開発者は喜んでくれるのでは?と思ったのがキッカケでした。
特に「テーブル設計は保存可能」なので、前回作ったテーブル設計から新しい設計を複製できるのは嬉しい機能です。設計してMigration or CRUDコード書き出してができるので、「設計して→コード書いて」という往復作業が無くなるので、是非使ってほしいと思います。

今後の展開

2020-09-24以降からは「Migration」を軸にアップデートしていきます
なぜ、↑そう思ったか?
良かれと思った機能が意外に余計だった。。。よくあるパターンですね。
テーブル名に"t_","m_"とかトランザクション・マスターテーブルなどがテーブル名で分かるようにした場合に、自動で「timestamps」「softDeletes」などを挿入する機能が逆に「解りにくくさせていた」という事があります。今回のアップデートで廃止いしたのでご安心ください(余計なことはしません(^^))。
やはりシンプルがベストなんですよね。今はいかに「シンプルにするか」だけ考えてアップデートを考えています。
※必要な機能はどうやって複雑にせずに追加するか?など、悩みが楽しくてしょうがありません。
※CRUD(β版)機能のアップデートはどうなるか未定(Laravel7までは動作確認ずみ)
※Laravel8移行のLTSの仕様で検討予定ですかね~~~かなり変わってるように思ったので。

◇LaravelDB.com サイト

laravelDB.com

◇Twitterアカウント

LaravelDB.com

以上

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

LaravelDB.com~操作方法と勘所を書いた〜(2020/09/24メジャーアップデートに対応)

◇LaravelDB.com ?

Laravelのデータベース設計(ER図)するだけで、Migrationファイルがポンって作成できるFreeの「 テーブル設計&Migration作成 」 ツールです。

image.png

メイン機能

  • Migrationの自動生成
  • チームメンバーとの共有可能
  • CRUDコード(β版)の自動生成
  • CRUDコード(β版)でのValidation自動生成(テーブル設計に合わせて自動で生成)

用途

用途は開発者によってバラバラですね。
・Migrationのみ使う(ほとんどの人はここですかね)
・CRUDファイル全部(数%くらいの人)
・コード生成後、一部(Validationとか)をコピーして使う(結構な割合でいます)
・テーブル設計の共有(Team開発では使ってるようです)

◇操作方法(マニュアル)

1.テーブル作成

2.カラム作成


※使いやすくするポイント!! 「列を追加」ボタンを連打で必要な数だけ先に作ると便利!!

3.2020-09-24アップデートから使用可能

「 ENUM, UNSIGNED ] に対応、新規プロジェクトより表示されるようになります

以下はENUM、Doubleの入力してる例です。

「 UNIQUE, INDEX ] に対応、新規プロジェクトより表示されるようになります

外部キーの設定

外部キー制約を使用する場合( ※1対他、多対多などを分ける機能は無い)

4.ER図の保存

コントロールパネル[Data:セーブ/ロード]から移動します。

「クラウドに保存」or「ブラウザに保存」を選択できます。

この例では「クラウドに保存」を選択。

Save/Load機能 機能詳細
クラウドへ保存 アカウントに紐づきクラウドに保存します。
クラウドデータ一覧 保存したクラウド側のデータ一覧
ブラウザに保存 使用中のブラウザ「LocalStorage」に一時保存
ブラウザデータ一覧 localStorageに保存したデータ一覧

上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図を復元します。

5.Migrationを生成

[ER図から出力]内のBuild [Migration]ボタンをクリックしてダウンロードします!


Zipファイルを解凍してダウンロードファイルを確認。

【ER図をTeamでシェア】

テーブル設計をシェアする機能のことです。

1 [送信側:シェアData]作成


見せたい相手にIDを渡しておいて、変更があれば「Create a [Share ID]」ボタンを押すと毎度データ更新されることを知っておきましょう!

2 [送信側:シェアData] IDをコピー

ここでコピーしたIDを相手に知らせます。

3 [受信側:シェアData]読み込み

相手は送られてきた[シェアData]IDを貼り付けます。

4 「Read」ボタンをクリックしてデータを受信表示しましょう。

3.シェアデータの複製が完了!!

受信側にデータが入りました!受信側もそのデータを活用できるようになります。
チーム・メンタリング等のケースでも利用可能です。

※受信後は「別名を付けて保存しておくと良いでしょう!」

◇ β版のCRUD/リレーションを使用したい場合(まだまだ開発段階の未知の機能)

<重要>この機能はテーブル名の末尾に「s」が無いとうまく動作しません。
※ENUMは必須・未入力のみ出力。
※intは型・必須・未入力のみ出力、sizeが未対応。
※2020-09-24Migrtion機能にアップデートが入ったので、β版機能に影響があるかもしれません。

  1. まずは、複数のテーブルを簡単に作り「外部キーの接続」をして準備してください!!
    その後、右メニュー「 [Data]セーブ/ロード 」クリックすると以下画面が表示されます。

  2. BUILD [CRUD CODE] をクリック!!CRUD ファイル一式が生成されます

【ポイント】
  • Relation(Beta)にチェックを入れておくとリレーションします。

  • BUILD [MIGRATION] でもリレーション(QueryBuilder)がコメントで生成されますよ。

【このツールでのリレーションのポイント】

  • JOINしてるテーブルの全ての項目を最初は表示します(同項目名が存在する場合、片方のみ表示します)。
  • CRUDのコードが生成されたら、仕様に合わせてHTMLテーブルの項目を削除してください。
  • リレーションは上記画像のように「チェック」を入れないと生成しないようにしています(Beta版のため)。
  • Controller内にコードが生成されてますので、確認しておくと良いでしょう!
  • 外部キーはこのツールでは非推奨としています(理由:Migrationの実行順序が重要でエラーになりやすい為) プロトタイプ(ベースになるコードを生成してくれる)には十分すぎる機能ですね。

◇Validation → テーブル設計に合わせて生成

Validationって地味に面倒ですよね、完璧では内容ですが、少しの手直しで使用できるなら便利そうです!!

例でざっくりテーブルをER図で書いてみました。
以下"t_gsusers"テーブルを中心に見ていきます。

生成されたコントローラーのcreate(),edit()にはこういったvalidationが挿入されます。

TGsusersController
            $this->validate($request, [
                "name" => "required|max:128", //string('name',128)
                "lid" => "required|max:128", //string('lid',128)
                "lpw" => "required|max:128", //string('lpw',128)
                "m_department_id" => "required|integer", //integer('m_department_id')
                "m_position_id" => "required|integer", //integer('m_position_id')
                "m_prefectures_id" => "required|integer", //integer('m_prefectures_id')
                "m_kanri_id" => "required|integer", //integer('m_kanri_id')
                "m_lifeflg_id" => "required|integer", //integer('m_lifeflg_id')
                "m_test_id" => "required|integer", //integer('m_test_id')

            ]);

{{old('name')}} → 入力項目を補完(CRUD:β版を使用した場合に生成されます)

validationで未入力等ではじかれた場合、入力した文字を消さずに表示します。

ベータ版のCRUD/リレーションの利用シーン

上記のようにβ版ではありますが、全てを利用するというよりは、コードを生成して、必要な部分だけ使うのも良いと思います。(実際にそういったケースを耳にしました〜)

◇LaravelDB.com 対応カラム一覧

tinyIncrements
mediumIncrements
smallIncrements
bigIncrements
increments
mediumInteger
smallInteger
bigInteger
tinyInteger
integer
unsignedInteger (2020-09-24対応)
unsignedTinyInteger (2020-09-24対応)
unsignedSmallInteger (2020-09-24対応)
unsignedMediumInteger (2020-09-24対応)
unsignedBigInteger (2020-09-24対応)
decimal
double
float
enum (2020-09-24対応)
geometryCollection
geometry
jsonb
json
char
longText
mediumText
text
multiLineString
lineString
string
multiPoint
multiPolygon
point
polygon
binary
nullableTimestamps
timestamps (2020-09-24対応)
softDeletes (2020-09-24対応)
dateTime
timestamp
time
year
date

◇そもそも、なんで作ったの?

私は学校でプログラミング(サービスを作る基本)を教えていて、テーブル設計している学生がその場にいて
「テーブル設計して、そこからMigrationファイル作成して、コードをイチから書いて・・・」普通の作業ではあるんですが、何故か「その時は疑問を感じました」、ER図書いたらMigrationファイル生成したら便利だよね~。
何割かの開発者は喜んでくれるのでは?と思ったのがキッカケでした。
特に「テーブル設計は保存可能」なので、前回作ったテーブル設計から新しい設計を複製できるのは嬉しい機能です。設計してMigration or CRUDコード書き出してができるので、「設計して→コード書いて」という往復作業が無くなるので、是非使ってほしいと思います。

今後の展開

2020-09-24以降からは「Migration」を軸にアップデートしていきます
なぜ、↑そう思ったか?
良かれと思った機能が意外に余計だった。。。よくあるパターンですね。
テーブル名に"t_","m_"とかトランザクション・マスターテーブルなどがテーブル名で分かるようにした場合に、自動で「timestamps」「softDeletes」などを挿入する機能が逆に「解りにくくさせていた」という事があります。今回のアップデートで廃止いしたのでご安心ください(余計なことはしません(^^))。
やはりシンプルがベストなんですよね。今はいかに「シンプルにするか」だけ考えてアップデートを考えています。
※必要な機能はどうやって複雑にせずに追加するか?など、悩みが楽しくてしょうがありません。
※CRUD(β版)機能のアップデートはどうなるか未定(Laravel7までは動作確認ずみ)
※Laravel8移行のLTSの仕様で検討予定ですかね~~~かなり変わってるように思ったので。

◇LaravelDB.com サイト

laravelDB.com

◇Twitterアカウント

LaravelDB.com

以上

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

LaravelDB.com~操作方法と勘所を書いた〜2020/09/24メジャーアップデート版

◇LaravelDB.com ?

Laravelのデータベース設計(ER図)するだけで、Migrationファイルがポンって作成できるFreeの「 テーブル設計&Migration作成 」 ツールです。

image.png

メイン機能

  • Migrationの自動生成
  • チームメンバーとの共有可能
  • CRUDコード(β版)の自動生成
  • CRUDコード(β版)でのValidation自動生成(テーブル設計に合わせて自動で生成)

用途

用途は開発者によってバラバラですね。
・Migrationのみ使う(ほとんどの人はここですかね)
・CRUDファイル全部(数%くらいの人)
・コード生成後、一部(Validationとか)をコピーして使う(結構な割合でいます)
・テーブル設計の共有(Team開発では使ってるようです)

◇操作方法(マニュアル)

1.テーブル作成

2.カラム作成


※使いやすくするポイント!! 「列を追加」ボタンを連打で必要な数だけ先に作ると便利!!

3.2020-09-24アップデートから使用可能

「 ENUM, UNSIGNED ] に対応、新規プロジェクトより表示されるようになります

以下はENUM、Doubleの入力してる例です。

「 UNIQUE, INDEX ] に対応、新規プロジェクトより表示されるようになります

外部キーの設定

外部キー制約を使用する場合( ※1対他、多対多などを分ける機能は無い)

4.ER図の保存

コントロールパネル[Data:セーブ/ロード]から移動します。

「クラウドに保存」or「ブラウザに保存」を選択できます。

この例では「クラウドに保存」を選択。

Save/Load機能 機能詳細
クラウドへ保存 アカウントに紐づきクラウドに保存します。
クラウドデータ一覧 保存したクラウド側のデータ一覧
ブラウザに保存 使用中のブラウザ「LocalStorage」に一時保存
ブラウザデータ一覧 localStorageに保存したデータ一覧

上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図を復元します。

5.Migrationを生成

[ER図から出力]内のBuild [Migration]ボタンをクリックしてダウンロードします!


Zipファイルを解凍してダウンロードファイルを確認。

【ER図をTeamでシェア】

テーブル設計をシェアする機能のことです。

1 [送信側:シェアData]作成


見せたい相手にIDを渡しておいて、変更があれば「Create a [Share ID]」ボタンを押すと毎度データ更新されることを知っておきましょう!

2 [送信側:シェアData] IDをコピー

ここでコピーしたIDを相手に知らせます。

3 [受信側:シェアData]読み込み

相手は送られてきた[シェアData]IDを貼り付けます。

4 「Read」ボタンをクリックしてデータを受信表示しましょう。

3.シェアデータの複製が完了!!

受信側にデータが入りました!受信側もそのデータを活用できるようになります。
チーム・メンタリング等のケースでも利用可能です。

※受信後は「別名を付けて保存しておくと良いでしょう!」

◇ β版のCRUD/リレーションを使用したい場合(まだまだ開発段階の未知の機能)

<重要>この機能はテーブル名の末尾に「s」が無いとうまく動作しません。
※ENUMは必須・未入力のみ出力。
※intは型・必須・未入力のみ出力、sizeが未対応。
※2020-09-24Migrtion機能にアップデートが入ったので、β版機能に影響があるかもしれません。

  1. まずは、複数のテーブルを簡単に作り「外部キーの接続」をして準備してください!!
    その後、右メニュー「 [Data]セーブ/ロード 」クリックすると以下画面が表示されます。

  2. BUILD [CRUD CODE] をクリック!!CRUD ファイル一式が生成されます

【ポイント】
  • Relation(Beta)にチェックを入れておくとリレーションします。

  • BUILD [MIGRATION] でもリレーション(QueryBuilder)がコメントで生成されますよ。

【このツールでのリレーションのポイント】

  • JOINしてるテーブルの全ての項目を最初は表示します(同項目名が存在する場合、片方のみ表示します)。
  • CRUDのコードが生成されたら、仕様に合わせてHTMLテーブルの項目を削除してください。
  • リレーションは上記画像のように「チェック」を入れないと生成しないようにしています(Beta版のため)。
  • Controller内にコードが生成されてますので、確認しておくと良いでしょう!
  • 外部キーはこのツールでは非推奨としています(理由:Migrationの実行順序が重要でエラーになりやすい為) プロトタイプ(ベースになるコードを生成してくれる)には十分すぎる機能ですね。

◇Validation → テーブル設計に合わせて生成

Validationって地味に面倒ですよね、完璧では内容ですが、少しの手直しで使用できるなら便利そうです!!

例でざっくりテーブルをER図で書いてみました。
以下"t_gsusers"テーブルを中心に見ていきます。

生成されたコントローラーのcreate(),edit()にはこういったvalidationが挿入されます。

TGsusersController
            $this->validate($request, [
                "name" => "required|max:128", //string('name',128)
                "lid" => "required|max:128", //string('lid',128)
                "lpw" => "required|max:128", //string('lpw',128)
                "m_department_id" => "required|integer", //integer('m_department_id')
                "m_position_id" => "required|integer", //integer('m_position_id')
                "m_prefectures_id" => "required|integer", //integer('m_prefectures_id')
                "m_kanri_id" => "required|integer", //integer('m_kanri_id')
                "m_lifeflg_id" => "required|integer", //integer('m_lifeflg_id')
                "m_test_id" => "required|integer", //integer('m_test_id')

            ]);

{{old('name')}} → 入力項目を補完(CRUD:β版を使用した場合に生成されます)

validationで未入力等ではじかれた場合、入力した文字を消さずに表示します。

ベータ版のCRUD/リレーションの利用シーン

上記のようにβ版ではありますが、全てを利用するというよりは、コードを生成して、必要な部分だけ使うのも良いと思います。(実際にそういったケースを耳にしました〜)

◇LaravelDB.com 対応カラム一覧

tinyIncrements
mediumIncrements
smallIncrements
bigIncrements
increments
mediumInteger
smallInteger
bigInteger
tinyInteger
integer
unsignedInteger (2020-09-24対応)
unsignedTinyInteger (2020-09-24対応)
unsignedSmallInteger (2020-09-24対応)
unsignedMediumInteger (2020-09-24対応)
unsignedBigInteger (2020-09-24対応)
decimal
double
float
enum (2020-09-24対応)
geometryCollection
geometry
jsonb
json
char
longText
mediumText
text
multiLineString
lineString
string
multiPoint
multiPolygon
point
polygon
binary
nullableTimestamps
timestamps (2020-09-24対応)
softDeletes (2020-09-24対応)
dateTime
timestamp
time
year
date

◇そもそも、なんで作ったの?

私は学校でプログラミング(サービスを作る基本)を教えていて、テーブル設計している学生がその場にいて
「テーブル設計して、そこからMigrationファイル作成して、コードをイチから書いて・・・」普通の作業ではあるんですが、何故か「その時は疑問を感じました」、ER図書いたらMigrationファイル生成したら便利だよね~。
何割かの開発者は喜んでくれるのでは?と思ったのがキッカケでした。
特に「テーブル設計は保存可能」なので、前回作ったテーブル設計から新しい設計を複製できるのは嬉しい機能です。設計してMigration or CRUDコード書き出してができるので、「設計して→コード書いて」という往復作業が無くなるので、是非使ってほしいと思います。

今後の展開

2020-09-24以降からは「Migration」を軸にアップデートしていきます
なぜ、↑そう思ったか?
良かれと思った機能が意外に余計だった。。。よくあるパターンですね。
テーブル名に"t_","m_"とかトランザクション・マスターテーブルなどがテーブル名で分かるようにした場合に、自動で「timestamps」「softDeletes」などを挿入する機能が逆に「解りにくくさせていた」という事があります。今回のアップデートで廃止いしたのでご安心ください(余計なことはしません(^^))。
やはりシンプルがベストなんですよね。今はいかに「シンプルにするか」だけ考えてアップデートを考えています。
※必要な機能はどうやって複雑にせずに追加するか?など、悩みが楽しくてしょうがありません。
※CRUD(β版)機能のアップデートはどうなるか未定(Laravel7までは動作確認ずみ)
※Laravel8移行のLTSの仕様で検討予定ですかね~~~かなり変わってるように思ったので。

◇LaravelDB.com サイト

laravelDB.com

◇Twitterアカウント

LaravelDB.com

以上

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

【Vue.js】Error compiling template: .. outside root element will be ignored.エラーの対処

環境

PHP 7.3.8
Laravel 6.18.35
vue.js 2.6.12

対処法

[Vue warn]: Error compiling template:
text ""="">" outside root element will be ignored.

文字通りテンプレートのコンパイルエラーという事で、
template内にタグに囲まれていない部分があるという指摘です。

index.blade.php
//"が多い
<div style="width:calc(50% - .25rem);"">

//不要な"を削除
<div style="width:calc(50% - .25rem);">

これはvueファイル、コンポーネント内のテンプレだけでなく、読み込んでいるbladeでのタグ囲い漏れなども同様のエラーを検出します。

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

[Laravel]Gmailを利用したメール送信

自身のLaravel学習の備忘録として。
Laravelにおいてメール送信機能はパスワードリマインダーなどで使用される。
パスワードを忘れてしまい、ログイン出来ないときにemailに再設定のメールを送るやつ。

以下の写真において,画面右上に「LOGIN」と「REGISTER」が表示されているように、すでにアプリケーションに認証機能を実装された状態。

スクリーンショット 2020-09-24 0.54.27.png

環境

macOS Catalina バージョン10.15.4
Laravel 5.8.38

Gmail側の設定

以下のURLから設定。
https://myaccount.google.com/security

googleアカウントでは以下の設定を行う。
  ・「2段階認証プロセス」を「オン」にする
  ・「アプリパスワード」を設定する

「2段階認証プロセス」はスマートフォンのGoogleアプリを使うなどしてGoogleアカウントの認証を行う方法。
この設定をしないと次の「アプリパスワード」の設定が出来ない。

スクリーンショット 2020-09-24 0.08.44.png

アプリパスワードの「アプリを選択」のプルダウンで「その他(名前を入力)」を選択し、アプリ名を入力する。
写真では「Laravel」となっているがアプリ名はわかりやすいものがいい。

スクリーンショット 2020-09-24 0.20.24.png

「生成」ボタンを押すとアプリパスワードが表示される。
このパスワードをLaravelの設定ファイルに書き込む。

スクリーンショット 2020-09-24 0.28.41.png

Laravelの.envを開き、以下の部分を修正。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=****@gmail.com ← 自分のgmailのメールアドレス
MAIL_PASSWORD=**** ← アプリパスワード
MAIL_ENCRYPTION=tls

MAIL_PASSWORDには先ほど生成したアプリパスワードを入力。

ちなみにMAIL_PORTで指定した587という数字はSMTP(TLS/STARTTLS)のポート番号。

SMTP
SMTP(Simple Mail Transfer Protocol)とは、送信したメールを宛先のメールサーバーまで届ける技術のこと。
ユーザーがメールソフトウェア(例:Gmailなど)を使用してメールを送信すると、設定されているSMTPサーバーがメールを送信先のサーバーに配信します。

TLS
TLSとはSSLの次世代規格のことで、電子メールを暗号化することでプライバシーを保護するセキュリティプロトコルを指します。

STARTTLS
STARTTLSとは、メールの送受信を暗号化する方法です。送信サーバーから受信サーバーへのデータ通信を暗号化することにより、メール通信経路上の悪意のあるハッキングからメールを保護できます。

動作確認

実際に「REGISTER」からアカウントを登録。試しに自身のgmailのアドレスで登録。メールが届き、ログイン状態になればOK。

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

Laravel Envoy+CircleCIでEC2にデプロイ

概要

Laravel EnvoyとCircleCIを利用して、EC2にデプロイするということを試してみました。
https://laravel.com/docs/8.x/envoy
GithubのmasterブランチにマージされたらEC2上の本番サーバに、developブランチにマージされたらステージングサーバにデプロイされる想定です。

前提

設定

  • AWS上に本番環境(production)とステージング環境(staging)がEIPが割り当てられたEC2として存在する
  • EC2からgit pull可能
  • Githubでmasterとdevelopのブランチが存在するリポジトリ
  • Githubのリポジトリにpushした際CircleCIが実行されるよう連携済み

バージョン

PHP: 7.4.7
Laravel Envoy: 2.3.1

手順

Laravel Envoyの設定

$ composer require laravel/envoy

今回簡易的に以下のようにEnvoy.blade.phpを作成します。

Envoy.blade.php
@servers(['production' => 'ec2-user@xx.xx.xx.xx', 'staging' => 'ec2-user@yy.yy.yy.yy'])

@setup
    $docRoot = '/var/www/html';
@endsetup

@story('deploy')
    git
@endstory

@task('git', ['on' =>  $server])
    cd {{ $docRoot }}
    git pull origin {{ $branch }}
@endtask

@finished
    echo "${server}へデプロイしました!";
@endfinished

CircleCIからEC2にデプロイするための設定

CircleCIからEC2にSSHするための設定

CircleCIのプロジェクトの設定ページからSSH Keys>Additional SSH Keysへ進み、「Add SSH Key」で各サーバへSSH接続するための秘密鍵を登録します。HostnameにEIP、Private Keyに秘密鍵を入力します。
登録するとFingerprintが表示されているので、これを控えておきます。
スクリーンショット 2020-09-24 0.06.50.png
EC2作成時に生成されるキーペアを用いる場合は不要ですが、新しく鍵を生成した場合は下記のようにして、公開鍵を~/.ssh/authorized_keysに追記しておく必要があります。

$ cat id_rsa.pub >> authorized_keys

環境変数の登録

CircleCIのプロジェクトの設定ページからEnvironment Variablesへ進み、「Add Variable」で必要な環境変数を登録します。今回は本番/ステージングサーバのEIP、先程作成されたFingerprint、ユーザー名、SSHのポート番号を登録しています。
スクリーンショット 2020-09-24 0.09.07.png

configの設定

.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.4-apache
      - image: circleci/postgres:11-alpine
        environment:
          POSTGRES_DB: default_test
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
    steps:
      - checkout
      ##### 〜〜中略〜〜 #####
      # ----------------------------------------------------------------------------
      # Deploy

      - add_ssh_keys:  
          fingerprints:  
            - "${KEY_FINGERPRINT}" 
            - "${KEY_FINGERPRINT_DEV}"

      - run:  
          name: Start ssh-keyscan  
          command: ssh-keyscan -p ${SSH_PORT} ${HOST_NAME} >> ~/.ssh/known_hosts 

      - run:  
          name: Start ssh-keyscan(dev)
          command: ssh-keyscan -p ${SSH_PORT} ${HOST_NAME_DEV} >> ~/.ssh/known_hosts 

      - run:
          name: Deploy to EC2 server
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              ./vendor/bin/envoy run deploy --server=production --branch=master
            elif [ "${CIRCLE_BRANCH}" == "develop" ]; then
              ./vendor/bin/envoy run deploy --server=staging --branch=develop
            fi

動作確認

masterでもdevelopでもないブランチにpush

デプロイは実行されずに終了している。
スクリーンショット 2020-09-24 0.42.53.png

developにマージ

developブランチをpullしている。
スクリーンショット 2020-09-24 0.47.01.png

masterにマージ

masterブランチをpullしている。
スクリーンショット 2020-09-24 0.50.02.png

所感

関係ないブランチにも不要な処理が入ってしまうのはイマイチだった気がします。
もっと良いやり方ありましたら是非教えていただけたらと。

参照

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