Laravel ::类型错误:函数App \ Product :: getTax()的参数太少,0传递

时间:2018-03-20 07:20:58

标签: php laravel

我有这段代码:

public function taxesData(Product $product)
{
    $taxes = \Auth::user()->taxes;
    foreach ($taxes as $tax) {
        echo "$product->getTax($tax)";
    }
}

在测试中给出了这个错误:

  

类型错误:函数App \ Product :: getTax()的参数太少,在E:\ projects \ ims \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Eloquent \ Concerns \ HasAttributes.php中传递0 411行和预期的1个

然而,只是一个小小的变化使它有效,但我无法理解。为什么呢?

public function taxesData(Product $product)
{
    $taxes = \Auth::user()->taxes;
    foreach ($taxes as $tax) {
        echo $product->getTax($tax);
    }
}

请帮忙。

我试图简化它以便在这里发布...实际上我正在用数据表的html组件创建json - >

public function taxesData(Product $product)
{
    $taxes = \Auth::user()->taxes;
            return datatables()
        ->of($taxes)
        ->addColumn('check',function($tax) use($product){
            if($product->hasTax($tax)){
                return "<input type='checkbox' class='input-sm row-checkbox' name='tax[$tax->id]' value='$tax->id' checked>";
            }else{
                return "<input type='checkbox' class='input-sm row-checkbox' name='tax[$tax->id]' value='$tax->id'>";
            }
        })
        ->editColumn('tax', function($tax) use($product){
            return "<span class='currencyinput form-control'>
                    <input id='rate' type='text' name='rate' value='$product->getTax($tax)' required autofocus>
                    </span>"
        })
        ->toJson();
}

添加getTax方法

public function getTax(Tax $t)
{
    if($this->hasTax($t)){
        return  $this->taxes->find($t->id)->pivot->tax;
    }
    else{
        return $t->pivot->tax;
    }
}


public function hasTax(Tax $tax)
{
    foreach ($this->taxes as $t) {
        if($t->id == $tax->id){
            return true;
        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:4)

它失败了,因为你没有遵循正确的echo字符串语法。

这样可行:

echo "{$product->getTax($tax)}";
实际上,因为你没有&#39;需要引用这样一个简单的表达式:

echo $product->getTax($tax);

答案 1 :(得分:2)

这是我到目前为止所做的。

为简单起见,我创建了一个样本模型。

// SampleModel.php

public function relatedModels()
{
    return $this->hasMany(RelatedModel::class);
}

// this is like an accessor, but since our model doesn't have
// a property called `relatedModels`, Laravel will ignore it
// until later...
public function getRelatedModels()
{
    return "Sample";
}

鉴于以下代码,这里是输出。

$a = SampleModel::find($id);
$a->relatedModels;
// this returns a collection of related models to this model.
$a->getRelatedModels();
// this returns "Sample";

// HOWEVER, when we try to interpolate that member function call.
"$a->getRelatedModels()"
// this throws error that the method `getRelatedModels` must return a relationship.

// I've also tried to add an argument to my existing function to be in-line with your situation.
public function getRelatedModels($a) ...

// this works well
$a->getRelatedModels(1);
// but this, yes, it throws the error as same as what you've got.
"$a->getRelatedModels(1)";

错误在框架的代码库中指出了这一行。

// HasAttributes.php
protected function getRelationshipFromMethod($method)
{
    $relation = $this->$method(); // <-- this line

出于某种原因,执行"$a->getRelatedModels(1)"会触发模型的__get魔术方法。

哪个分支到此堆栈调用。

// Model.php
public function __get($key)
{
    return $this->getAttribute($key);
}
// |
// V
// HasAttributes.php
public function getAttribute($key)
{
    ...
    return $this->getRelationValue($key);
}
// |
// V
// HasAttributes.php
public function getRelationValue($key)
{
    ...
    if (method_exists($this, $key)) {
        return $this->getRelationshipFromMethod($key);
    }
}
// |
// V
// HasAttributes.php
protected function getRelationshipFromMethod($method)
{
    $relation = $this->$method(); // <-- lastly to this
    // $method = "getRelatedModels"
    // since our method `getRelatedModels` needs an argument
    // this call will fail since it wasn't able to provide an argument.
    ...
}

这就是为什么你得到过少的参数传递异常。我想进一步调查但我必须回家!

我不知道这是否是Laravel的合法错误,但如果您这么认为,请在Laravel的github存储库中发布。

<强>更新

我在github上发布了一个问题,这是对我真正有意义的评论之一。

这既不是Laravel的问题,也不是PHP的问题。您只是使用了错误的语法,请在此处查看:https://github.com/laravel/framework/issues/23639

Github用户 @staudenmeir 评论说:

  

"$sampleModel->getRelatedModels()"相当于"$sampleModel->getRelatedModels"."()"

     

字符串中变量的使用仅限于"$foo""$foo->bar"。像"$foo->bar()"这样的函数调用   不工作。你可以(但不应该)使用花括号:"{$foo->bar()}"

     

更好的解决方案就是简单的字符串连接:

     

"text..." . $sampleModel->getRelatedModels() . "more text..."

这就是为什么要调用魔术方法__get