web-dev-qa-db-ja.com

Laravel createメソッドを拡張/オーバーライドするnovaリソース

Laravel Nova を使用してWeb管理パネルを開発しています。

Novaはまったく新しいテクノロジーなので、問題が発生しています。

ここでやりたいのは、非表示フィールドを追加するか、createメソッドを拡張またはオーバーライドしたいということです。

これが私のシナリオです。次のフィールドを持つvacancynovaリソースがあることを保存しましょう。

_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の作成機能をオーバーライドまたは拡張するにはどうすればよいですか?どうすればそれを達成できますか?

リソースイベントを使用できますが、イベントでログインしたユーザーを取得するにはどうすればよいですか?

4
Wai Yan Hein

あなたが探しているのは リソースイベント です。

ドキュメントから:

すべてのNova操作は、使い慣れた一般的な保存、削除、forceDelete、復元のEloquentメソッドを使用します。したがって、Novaによってトリガーされたモデルイベントをリッスンし、それらに対応するのは簡単です。最も簡単なアプローチは、モデルオブザーバーをモデルにアタッチすることです。

新しいオブザーバブルを作成したくない場合は、次のように雄弁なモデルにbootメソッドを作成することもできます。

public static function boot()
{
    parent::boot();

    static::creating(function ($vacancy) {
        $vacancy->created_by = auth()->user()->id;
    });
}

ただし、これらは監視可能なものよりも追跡が少し難しいことに注意してください。将来、あなたや次の開発者は、「created_at」プロパティがどのように設定されているのか疑問に思って頭を悩ませる可能性があります。

12
Elena Kolevska

私の意見では、あなたは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])
6
Fawzan

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;
}
2
ElectroBuddha