Laravel执行db:seed报错:参数需为Faker\Generator\Generator实例
解决Laravel Seeder中Faker类型不匹配的错误
这个错误的根源很明确——你在工厂类里的类型提示和引入的Faker别名不匹配,导致PHP无法正确识别Faker生成器的类。
先看你的错误提示:
Type error: Argument 1 passed to Illuminate\Database\Eloquent\Factory::{closure}() must be an instance of Faker\Generator\Generator, instance of Faker\Generator given
这说明你闭包里的参数类型被错误解析成了不存在的Faker\Generator\Generator类,但实际传入的是正确的Faker\Generator实例,问题出在UserFactory.php的类型提示写法上。
你已经在文件顶部引入了:
use Faker\Generator as Faker;
这意味着你把Faker\Generator这个类别名为Faker了,但在闭包里你还是写了Faker\Generator $faker,PHP会错误地将其解析为「当前命名空间下Faker\Generator类的内部Generator类」,也就是不存在的Faker\Generator\Generator,自然就报类型不匹配了。
解决方法
只需要把闭包里的参数类型提示改成你定义的别名Faker即可,修正后的UserFactory.php代码如下:
use Faker\Generator as Faker; $factory->define(App\Models\Admin::class, function (Faker $faker) { static $password; return [ 'name' => $faker->name, 'email' => $faker->safeEmail, 'password' => $password ?: $password = bcrypt('secret'), 'remember_token' => str_random(10), ]; });
如果你不想用别名,也可以直接使用完整的全局命名空间(注意前面的反斜杠):
$factory->define(App\Models\Admin::class, function (\Faker\Generator $faker) { // 其余代码保持不变 });
验证修改
修改完成后,重新运行:
php artisan db:seed
这个类型错误应该就会消失,Seeder可以正常执行了。
内容的提问来源于stack exchange,提问作者robspin
相关产品推荐
相关产品推荐

