(jp) =
複雑な Laravel Nova プロジェクトを構築するときに私が使用する主要なコーディング アーキテクチャ戦略の 1 つは、抽象リソース クラスを持つ機能です。
ところで、始める前に、Nova を深く掘り下げたい場合は、今年の真夏にリリースされる私の今後のコース Mastering Nova の最新情報を購読することをお勧めします!
抽象リソース クラスはベースを継承します Resource
クラス。 これにより、特定のメソッドをオーバーライドして、実際のリソース クラスに機能を追加できます。
最終的に、カスタム基本クラスで改善したメソッドはすべて、モデル リソースで使用できるようになります。 抽象リソースの作成方法を示してから、具体的な改善を行います。
まず、内部に AbstractResource.php ファイルを作成します。 app/Nova
、 このような:
app/
Nova/
AbstractResource.php
最初は、 AbstractResource
次のようになります。
namespace App\Nova;
abstract class AbstractResource extends Resource
次に、 Resource クラスでは、Nova Resource の代わりに、この抽象 Resource から継承するだけです。
namespace App\Nova;
use App\Nova\AbstractResource;
class Review extends AbstractResource
それでは、新しい抽象リソースに追加できる改善の例をいくつか見てみましょう。
# デフォルトのソート
抽象リソースに次のコードを記述します。
public static function indexQuery(NovaRequest $request, $query)
$uriKey = static::uriKey();
if (($request->orderByDirection ?? null) !== null)
return $query;
if (! empty(static::$indexDefaultOrder))
$query->getQuery()->orders = [];
return $query->orderBy(
key(static::$indexDefaultOrder),
reset(static::$indexDefaultOrder)
);
次に、モデル リソースで次のようにします。
public static $indexDefaultOrder = ['email' => 'asc'];
これにより、事前に選択された並べ替え順序がない場合に備えて、インデックス クエリが “email, asc” で並べ替えられます。
# 検索関係
関連フィールドがある場合、それを使用してリソース検索フィールドを検索できないことに気付いたかもしれません。 その場合は、
titasgailius/search-relations
パッケージ。
インストールするには、Composer 経由でインポートするだけです。
composer require titasgailius/search-relations
次に、抽象リソースに次のように追加できます。
use Titasgailius\SearchRelations\SearchesRelations;
abstract class AbstractResource extends Resource
use SearchesRelations;
今後は、モデル リソースに以下を追加するだけです。
public static $searchRelations = [
'user' => ['username', 'email'],
];
ここで、キーは関係名で、次に検索可能な列値の配列です。 したがって、関係列を検索できるようになりました。
# カード、レンズ、アクション、フィルターの共有
現在のリソースが最後に更新されたのはいつかに関する情報と、リソースに関するその他の追加情報を示す汎用カードが必要だとします。 または、共有するモデルのステータスを実際に変更するアクション status_type
桁。
この機能はすべて、モデル リソース間で共有できます。
例として、抽象リソースを共有するすべてのモデル リソースに新しいカードを追加するとします。次のように実行できます。
public function cards(Request $request)
return [
new ResourceInformation(
$this->getCurrentResourceInstance($this->getModelInstance())
),
];
protected function getModelInstance()
$resourceKey = explode("https://stitcher.io/", request()->path())[1];
$resourceClass = Nova::resourceForKey($resourceKey);
return new $resourceClass::$model;
そしてあなたのモデルリソースで:
public function cards(Request $request)
return array_merge(
[],
parent::cards($request),
);
# ‘trashed’ 動作を無効にする
の BelongsTo
フィールドには、「With Trashed」チェックボックスを削除するオプションがすでにありますが (基本的には、ゴミ箱に入れられたアイテムを表示しないようにします)、他の関係操作からそれを削除したい場合はどうすればよいでしょうか (例: BelongsToMany
)?
抽象リソースに次のコードを適用するだけです。
use Illuminate\Support\Facades\Gate;
public static function softDeletes()
if (static::authorizable())
if (! method_exists(
Gate::getPolicyFor(static::newModel()),
'trashedAny'
))
return true;
return Gate::check('trashedAny', static::class));
;
return parent::softDeletes();
この例では、モデルのポリシーを定義し、次の新しいメソッドを作成するだけです。 trashedAny(User $user)
、例として:
public function trashedAny(User $user)
return false;
これらは、Nova プロジェクトで抽象リソースを活用する方法について考えるきっかけとなる例です。
そして、私があなたを納得させることができたなら:) この夏にリリースされる私の次のコースMastering Novaの最新情報を購読することをお勧めします!
ベスト、ブルーノ