问题描述
我正在尝试使用 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 然后将提供的值传递给回调以检查它是否有效。