BigJobbies
BigJobbies

Reputation: 4033

Laravel 8 collection erroring saying instance of model passed instead of resource

I have a simple controller;

namespace App\Http\Controllers\Databases;

use App\Models\Database;
use App\Http\Resources\DatabaseCollection;
use Illuminate\Http\Request;

class DatabaseController extends Controller
{
    public function index(Request $request)
    {
        return new DatabaseCollection(Database::all());
    }
}

It is meaning to return a list of database credentials which we store in the DB;

The collection resource looks like so;

namespace App\Http\Resources;

use App\Models\Database;
use Illuminate\Http\Resources\Json\ResourceCollection;

class DatabaseCollection extends ResourceCollection
{
    public function toArray($request)
    {
        $this->collection->transform(function (Database $database) {
            return new DatabaseResource($database);
        });

        return parent::toArray($request);
    }
}

and then the standard resource looks like so;

namespace App\Http\Resources;

use App\Models\Database;

class DatabaseResource extends Resource
{
    public function toArray($request): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'host' => $this->host,
            'port' => $this->port,
        ];
    }
}

This is returning an error;

Argument 1 passed to App\Http\Resources\DatabaseCollection::App\Http\Resources\{closure}() must be an instance of App\Models\Database, instance of App\Http\Resources\DatabaseResource given

It is a bit strange as i am using this same method for a handful of controllers and it all works perfect, except this is the only one that returns this error.

Any help would be awesome.

Upvotes: 1

Views: 399

Answers (1)

Anurat Chapanond
Anurat Chapanond

Reputation: 2977

Your code does not define Resource class anywhere so it assumes it should be found in the current namespace App\Http\Resources

namespace App\Http\Resources;

class DatabaseResource extends Resource

However Laravel defines Resource class like this.

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource

https://laravel.com/docs/8.x/eloquent-resources
So you should update your code accordingly.

Upvotes: 2

Related Questions