【问题标题】:Argument 1 passed to ::showAll() must be an instance of Collection, instance ofCollection given, called BuyerProductController.php on line 23传递给 ::showAll() 的参数 1 必须是 Collection 的实例,给定的Collection 实例,在第 23 行调用 BuyerProductController.php
【发布时间】:2020-12-19 00:57:18
【问题描述】:

我不明白这个错误,有人可以帮助我吗?

我正在学习 ApiRestfull 课程,代码适用于老师,但我无法让它为我工作

我使用的是 laravel 5.8*

他给我看的错误是这样的:错误:

传递给 App\Http\Controllers\ApiController::showAll() 的参数 1 必须是 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);
    }
}

ApiController:

<?php

namespace App\Http\Controllers;

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

class ApiController extends Controller
{
    use ApiResponser;
}

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方法的代码

标签: laravel


【解决方案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);
    }
}

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2020-02-06
  • 2020-11-26
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2017-04-06
  • 1970-01-01
相关资源
最近更新 更多