diff --git a/src/CorePlugin.php b/src/CorePlugin.php index 0187933..35777b5 100644 --- a/src/CorePlugin.php +++ b/src/CorePlugin.php @@ -102,9 +102,21 @@ class CorePlugin implements Plugin CustomerResource::class => CustomerErasureRelationsExtension::class, ]); - Product::macro('reviews', function (): HasMany { - /** @var Product $this */ - return $this->hasMany(ProductReview::class); + // resolveRelationUsing(), not macro() — Illuminate\Database\Eloquent\ + // Model does not use the Macroable trait in this Laravel version, so + // Product::macro(...)/Customer::macro(...)/$userModel::macro(...) + // silently fall through to Model::__callStatic(), which instantiates + // the model and tries to call the method as a real one, hitting + // newQuery()->getConnection() — this crashes every console command + // and every request, since CorePlugin::register() runs during + // provider registration, before the DB connection is configured + // ("Call to a member function connection() on null"). This bit us + // once already; resolveRelationUsing() is Eloquent's real, intended, + // connection-free extension point for exactly this (Order:: + // resolveRelationUsing('shipments', ...) in ShippingServiceProvider + // already uses it correctly). + Product::resolveRelationUsing('reviews', function (Product $product): HasMany { + return $product->hasMany(ProductReview::class); }); // Customer::erasureRequests()/exportRequests() and the User-model @@ -115,24 +127,22 @@ class CorePlugin implements Plugin // Customer or a User (see docs/privacy.md "User-scope vs Customer-scope"), // so this is a MorphMany built by hand rather than a bare Eloquent // convention lookup. - Customer::macro('erasureRequests', function (): MorphMany { - /** @var Customer $this */ - return $this->morphMany(DataErasureRequest::class, 'subject', 'subject_type', 'subject_id'); + Customer::resolveRelationUsing('erasureRequests', function (Customer $customer): MorphMany { + return $customer->morphMany(DataErasureRequest::class, 'subject', 'subject_type', 'subject_id'); }); - Customer::macro('exportRequests', function (): MorphMany { - /** @var Customer $this */ - return $this->morphMany(DataExportRequest::class, 'subject', 'subject_type', 'subject_id'); + Customer::resolveRelationUsing('exportRequests', function (Customer $customer): MorphMany { + return $customer->morphMany(DataExportRequest::class, 'subject', 'subject_type', 'subject_id'); }); $userModel = config('auth.providers.users.model'); - $userModel::macro('erasureRequests', function (): MorphMany { - return $this->morphMany(DataErasureRequest::class, 'subject', 'subject_type', 'subject_id'); + $userModel::resolveRelationUsing('erasureRequests', function ($user): MorphMany { + return $user->morphMany(DataErasureRequest::class, 'subject', 'subject_type', 'subject_id'); }); - $userModel::macro('exportRequests', function (): MorphMany { - return $this->morphMany(DataExportRequest::class, 'subject', 'subject_type', 'subject_id'); + $userModel::resolveRelationUsing('exportRequests', function ($user): MorphMany { + return $user->morphMany(DataExportRequest::class, 'subject', 'subject_type', 'subject_id'); }); LunarStaff::addActivitylogExcept([