Laravel faker valid() 不应该被静态调用,但它不是

问题描述

我正在尝试使用 Laravel 中的 faker 提供的 valid() 方法,如下所示:

<?PHP

namespace Database\Factories;

use App\Models\Attribute;
use App\Faker\AttributeValue as AttributeValueProvider;
use App\Models\supplier;
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\AttributeValue;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;


class AttributeValueFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = AttributeValue::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function deFinition(): array
    {
        $this->faker->addProvider(AttributeValueProvider::class);
        $attribute = Attribute::orderBy('id','desc')->first();
        $attribute_name = $attribute->translate('en')->name;
        $attribute_value = $this->faker->valid($this->is_valid_attribute_value($this,$attribute->id))->get_attribute_values($attribute_name);
        $supplier_id = supplier::max('id');
        return [
            'en' => $attribute_value['en'] + ['supplier_id' => $supplier_id],'ar' => $attribute_value['ar'] + ['supplier_id' => $supplier_id],];
    }

    public function is_valid_attribute_value($attribute_value,$attribute_id): bool
    {
        $valid = Validator::make(['attribute_value_translations' => $attribute_value],[
            'attribute_value' => [Rule::unique('attribute_value_translations','value')->where(function($q) use ($attribute_id){
                $q->where('locale','en')
                    ->where('attribute_id',$attribute_id);
            })]
        ])->passes();
        return $valid;
    }
}



但它抛出以下错误

call_user_func_array(): 参数 #1 ($callback) 必须是有效的 回调,非静态方法 App\Faker\AttributeValue::valid() 不能 静态调用

如你所见,我不是静态调用它,请帮忙

解决方法

如文档示例代码中所述(摘录如下),Faker 需要回调作为 valid() 方法的参数。

$evenValidator = function($digit) {
    return $digit % 2 === 0;
};
for ($i = 0; $i < 10; $i++) {
    $values []= $faker->valid($evenValidator)->randomDigit;
}

然而,您的代码将函数的结果传递给 valid() 方法,而不是函数本身。

$attribute_value = $this->faker
    ->valid($this->is_valid_attribute_value($this,$attribute->id))
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  this is a boolean value,not a callback
    ->get_attribute_values($attribute_name);

要使用您的类的验证功能,您需要将其更改为类似

$attribute_value = $this->faker
    ->valid([$this,'is_valid_attribute_value'])
    ->yourFakeProvidedValue;

后跟提供的假值。 Faker 然后将提供的值传递给回调以检查它是否有效。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...