Laravel Nova を使用してWeb管理パネルを開発しています。
Novaはまったく新しいテクノロジーなので、問題が発生しています。
ここでやりたいのは、非表示フィールドを追加するか、createメソッドを拡張またはオーバーライドしたいということです。
これが私のシナリオです。次のフィールドを持つvacancy
novaリソースがあることを保存しましょう。
_public function fields(Request $request)
{
return [
ID::make()->sortable(),
Text::make('Title')->sortable(),
Text::make('Salary')->sortable()
// I will have another field, called created_by
];
}
_
とてもシンプルです。私がやりたいのは、_created_by
_という新しいフィールドをデータベースに追加したいということです。次に、そのフィールドには、現在ログに記録されているユーザーid
($request->user()->id
)が自動的に入力されます。
Novaの作成機能をオーバーライドまたは拡張するにはどうすればよいですか?どうすればそれを達成できますか?
リソースイベントを使用できますが、イベントでログインしたユーザーを取得するにはどうすればよいですか?
あなたが探しているのは リソースイベント です。
ドキュメントから:
すべてのNova操作は、使い慣れた一般的な保存、削除、forceDelete、復元のEloquentメソッドを使用します。したがって、Novaによってトリガーされたモデルイベントをリッスンし、それらに対応するのは簡単です。最も簡単なアプローチは、モデルオブザーバーをモデルにアタッチすることです。
新しいオブザーバブルを作成したくない場合は、次のように雄弁なモデルにboot
メソッドを作成することもできます。
public static function boot()
{
parent::boot();
static::creating(function ($vacancy) {
$vacancy->created_by = auth()->user()->id;
});
}
ただし、これらは監視可能なものよりも追跡が少し難しいことに注意してください。将来、あなたや次の開発者は、「created_at」プロパティがどのように設定されているのか疑問に思って頭を悩ませる可能性があります。
私の意見では、あなたはObservers
に行くべきです。オブザーバーを使用すると、コードが読みやすく、追跡しやすくなります。
Laravelオブザーバーで同じことを実現する方法は次のとおりです。
AppServiceProver.php
public function boot()
{
Nova::serving(function () {
Post::observe(PostObserver::class);
});
}
PostObserver.php
public function creating(Post $post)
{
$post->created_by = Auth::user()->id;
}
OR
Nova
フィールドをメタでハックするだけです。
Text::make('created_by')->withMeta(['type' => 'hidden', 'value' => Auth::user()->id])
Novaリソース内で直接それを行うこともできます。すべてのNovaリソースにはnewModel()
メソッドがあり、リソースがデータベースからモデルの新しいインスタンスをロードするときに呼び出されます。これをオーバーライドして、デフォルト値を設定するためのロジックを配置できます(値がすでに存在するかどうかを常に確認し、値がnullの場合にのみ設定する必要があります。これは、モデルが初めて作成される場合にのみ当てはまります。実際に必要なものです):
public static function newModel()
{
$model = static::$model;
$instance = new $model;
if ($instance->created_by == null) {
$instance->created_by = auth()->user()->id;
}
return $instance;
}