tighten / parental

Use single table inheritance in your Laravel app
MIT License
1.36k stars 98 forks source link

NovaResourceProvider Incorrect Resource Mapping #132

Open ZurabWeb opened 2 months ago

ZurabWeb commented 2 months ago

When two resources use one model, the resource mapping only references the last one sorted alphabetically.

app/Models/UserModel.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserModel extends Model {}

app/Nova/UserOne.php:

<?php

namespace App\Nova;

use Laravel\Nova\Http\Requests\NovaRequest;

class UserOne extends Resource {

    public static $model = \App\Models\UserModel::class;

    public function fields(NovaRequest $request): array
    {
        return [];
    }
}

app/Nova/UserTwo.php:

<?php

namespace App\Nova;

use Laravel\Nova\Http\Requests\NovaRequest;

class UserTwo extends Resource {

    public static $model = \App\Models\UserModel::class;

    public function fields(NovaRequest $request): array
    {
        return [];
    }
}

For the purposes of this test only, change the visibility of \Parental\Providers\NovaResourceProvider::setNovaResources() to public:

public function setNovaResources(): void

Tinker session without NovaResourceProvider:

> Nova::resourcesIn(app_path('Nova'));
= null

> resolve(\App\Models\UserModel::class);
= App\Models\UserModel {#6907}

> Nova::resourceForModel('App\Models\UserModel')
= "App\Nova\UserOne"

Tinker session with NovaResourceProvider:

> Nova::resourcesIn(app_path('Nova'));
= null

> $provider = new \Parental\Providers\NovaResourceProvider(app())
= Parental\Providers\NovaResourceProvider {#6906}

> $provider->setNovaResources()
= null

> resolve(\App\Models\UserModel::class);
= App\Models\CancellationPolicy {#6922}

> Nova::resourceForModel('App\Models\UserModel')
= "App\Nova\UserTwo"

As you can see from the above example, when NovaResourceProvider is booted, it changes the resource mapping, resulting in unexpected behavior.