【发布时间】:2021-05-31 00:07:48
【问题描述】:
我正在尝试使用 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() 不能 被静态调用
如你所见,我不是静态调用它,请帮助
【问题讨论】:
-
您实际上并没有向它传递函数回调,而是将函数的 result 传递给它。
-
正如我从doc 看到的,
valid()除了function作为参数,而不是boolean。