メモ。
基本機能、ディレクトリ構成など
https://qiita.com/ryokwkm/items/052fc8040027021675ec
Laravel
migrations
# migrations を実行し直す(一度テーブルを削除して作り直す)
sail artisan migrate:refresh
model
# model作成
php artisan make:model MyModelName
scope
スコープ名のルール
- scopeXxx を定義するとクエリ側は ->xxx() で呼べます
- 引数を取るスコープも同様に渡せます
public static function getLikeHourlyBetween($start, $end)
{
return self::query()
->likeHourly()
->whereBetween('period_start', [$start, $end])
->get();
}
public function scopeLikeHourly($query)
{
return $query->where('action_type', 'like')
->where('period_type', 'hourly');
}
public function scopeForPeriod($query, $start, $end)
{
return $query->whereBetween('period_start', [$start, $end]);
}
Filament
一覧画面
一覧画面のレコードをクリックした際に、編集画面ではなく別画面に遷移させる
デフォルトでは edit に遷移するようになっている。
これを変えたい場合は、recordUrl() を使う。
例えば edit ではなく、view画面に遷移させたい場合は以下のようになる。
public static function table(Table $table): Table
{
return $table
->columns([])
+ ->recordUrl(fn($record) => "/xxxx/{$record->getKey()}/view")
Widget
1. ウィジェットの追加
以下のコマンドでウィジェットを作成します。
コマンドを実行すると、どのタイプのウィジェットを作成するか尋ねられます。
ここで Custom を選択してください
php artisan make:filament-widget MyWidget
2. 作成されるファイル
Filamentが2つのファイルを作成します。
それぞれ編集して、好みの機能を実装してください。
PHPクラス: app/Filament/Widgets/MyWidget.php
Bladeビュー: resources/views/filament/widgets/my-widget.blade.php
3. ウィジェットを使用する
PanelProvider に設定することで、ウィジェットを表示できます。
public function panel(Panel $panel): Panel
{
return $panel
->default()
~略~
->widgets([
AccountWidget::class,
+ MyWidget::class,
])
Laravel 応用
🧐 Observerパターンとは?
-
定義: モデルのライフサイクルイベント(
creating,created,updating,deletedなど)を監視し、コールバック処理を分離できるLaravel (Eloquent) のクラス。 - 役割: モデルのCRUDに紐づく副作用処理(関連データの自動作成、ログ記録、通知など)を集約する。
Laravel (Eloquent) でモデルを扱う際、「モデルが作られたら、関連する設定も自動で作りたい」「削除されたら、ログを残したい」といった 副作用処理 が必要になることがあります。
こうした処理をコントローラーやサービスクラスに直接書くと、コードが複雑になりがちです。
そこで活躍するのが Observer(オブザーバー)パターン です。これはLaravelの標準機能で、モデルのライフサイクルイベント(作成、更新、削除など)を監視し、特定の処理を自動で実行させることができます。
実装例: NoteAccountObserver
1. Observerクラスの作成 (Artisan)
Observerクラス自体は、Artisanコマンドで簡単に生成できます。
# 基本的な作成
php artisan make:observer NoteAccountObserver
--model オプション を使うと、対象モデルのメソッド(created, updated など)が定義された雛形が自動で生成されるため、こちらが推奨です。
# NoteAccount モデル用の雛形を生成
php artisan make:observer NoteAccountObserver --model=NoteAccount
2. 登録
作成したObserverをモデルに紐付けます。App\Providers\AppServiceProvider::boot() 内で登録するのが一般的です。
// App\Providers\AppServiceProvider.php
public function boot(): void
{
NoteAccount::observe(\App\Observers\NoteAccountObserver::class);
}
3. 処理内容
NoteAccountObserver 側で、対応するイベントのメソッド(今回は created)を定義します。
-
挙動:
NoteAccountが作成された 後 (createdイベント)、NoteAccountAiSettingが存在しなければ自動で作成する。 -
効果: 管理画面、API、バッチなど、どの経路で
NoteAccountが作られても、必ずAI設定が作成される。
// App\Observers\NoteAccountObserver.php
class NoteAccountObserver
{
/**
* Handle the NoteAccount "created" event.
*/
public function created(NoteAccount $noteAccount): void
{
// 関連(aiSetting)が存在しなければ作成
if (! $noteAccount->aiSetting) {
$noteAccount->aiSetting()->create([
// default values...
]);
}
}
}