Аргумент 1, переданный в ::showAll(), должен быть экземпляром Collection, заданным экземпляромCollection, вызываемым BuyerProductController.php в строке 23.

Я не понимаю эту ошибку, может кто-нибудь мне помочь?

Я прохожу курс по ApiRestfull, и код работает для учителя, но я не могу заставить его работать для меня.

Я использую laravel 5.8 *

Ошибка, которую он показывает мне, такова: Ошибка:

Аргумент 1, переданный в App\Http\Controllers\ApiController::showAll(), должен быть экземпляром Illuminate\Database\Eloquent\Collection, экземпляром Illuminate\Support\Collection, который вызывается в C:\laragon\www\udemy-apirestfull \app\Http\Controllers\Buyer\BuyerProductController.php в строке 23

BuyerProductController.php:

<?php

namespace App\Http\Controllers\Buyer;

use App\Buyer;
use Illuminate\Http\Request;
use App\Http\Controllers\ApiController;

class BuyerProductController extends ApiController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Buyer $buyer)
    {
         $products = $buyer->transactions()->with('product')
             ->get()
             ->pluck('product');


            return $this->showAll($products);
    }
}

АпиКонтроллер:

<?php

namespace App\Http\Controllers;

use App\Traits\ApiResponser;
use Illuminate\Http\Request;

class ApiController extends Controller
{
    use ApiResponser;
}

Апиответчик:

<?php

namespace App\Traits;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Collection;

trait ApiResponser
{
    private function successResponse($data, $code)
    {
        return response()->json($data, $code);
    }

    protected function errorResponse($message, $code)
    {
        return response()->json(['error' => $message, 'code' => $code], $code);
    }

    protected function showAll(Collection $collection, $code = 200)
    {
        return $this->successResponse(['data' => $collection], $code);
    }

    protected function showOne(Model $instance, $code = 200)
    {
        return $this->successResponse(['data' => $instance], $code);
    }
}

Модель покупателя:

<?php

namespace App;

use App\Transaction;
use App\Scopes\BuyerScope;


    class Buyer extends User
    {
        protected static function boot()
        {
            parent::boot();
    
            static::addGlobalScope(new BuyerScope);
        }
    
        public function transactions()
        {
            return $this->hasMany(Transaction::class);
        }
    }

Модель продукта:

<?php

namespace App;

use App\Seller;
use App\Category;
use App\Transaction;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Product extends Model
{
    use SoftDeletes;
    const PRODUCTO_DISPONIBLE = 'disponible';
    const PRODUCTO_NO_DISPONIBLE = 'no disponible';


    protected $dates = ['deleted_at'];

    protected $fillable = [
        'name',
        'description',
        'quantity',
        'status',
        'image',
        'seller_id',
    ];
    public function estaDisponible()
    {
        return $this->status == Product::PRODUCTO_DISPONIBLE;
    }

    public function seller()
    {
        return $this->belongsTo(Seller::class);
    }

    public function transactions()
    {
        return $this->hasMany(Transaction::class);
    }

    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }


}

Модель сделки:

<?php

namespace App;

use App\Buyer;
use App\Product;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Transaction extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];
    protected $fillable = [
        'quantity',
        'buyer_id',
        'product_id',
    ];
    public function buyer()
    {
        return $this->belongsTo(Buyer::class);
    }

    public function product()
    {
        return $this->belongsTo(Product::class);
    }
}

Пожалуйста, опубликуйте код для метода showAll

Donkarnash 18.12.2020 17:50
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Как получить URL-адрес реферера в PHP и Laravel?
Как получить URL-адрес реферера в PHP и Laravel?
Когда пользователи посещают ваш сайт, бывает полезно знать, откуда они пришли. URL-адрес реферера предоставляет информацию о странице, на которой...
Привязка маршрутной модели в Laravel
Привязка маршрутной модели в Laravel
Laravel - один из самых популярных на сегодняшний день PHP-фреймворков. Одной из его многочисленных функций является Route Model Binding, которая...
0
1
1 060
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Illuminate\Database\Eloquent\Collection расширяет Illuminate\Support\Collection

Поэтому, если это не обязательно, вы можете изменить подпись метода showAll, чтобы принять Illuminate\Support\Collection в качестве параметра.

Не будет ошибки, если предоставленный параметр будет экземпляром Illuminate\Database\Eloquent\Collection.

<?php

namespace App\Traits;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;  //Changed here

trait ApiResponser
{
    private function successResponse($data, $code)
    {
        return response()->json($data, $code);
    }

    protected function errorResponse($message, $code)
    {
        return response()->json(['error' => $message, 'code' => $code], $code);
    }

    protected function showAll(Collection $collection, $code = 200)
    {
        return $this->successResponse(['data' => $collection], $code);
    }

    protected function showOne(Model $instance, $code = 200)
    {
        return $this->successResponse(['data' => $instance], $code);
    }
}

Другие вопросы по теме