当我运行 php artisan db:seed 时,我收到以下错误:
[ReflectionException] Class SongsTableSeeder does not exist
发生什么事了?
我的DatabaseSeeder 类:
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
$this->call('SongsTableSeeder');
}
}
我的SongsTableSeeder 课程:
<?php
// Composer: "fzaninotto/faker": "v1.4.0"
use Faker\Factory as Faker;
use Illuminate\Database\Seeder;
use DB;
class SongsTableSeeder extends Seeder {
public function run()
{
$faker = Faker::create();
$songs = [];
foreach(range(1, 10) as $index)
{
$songs[] = ['title' => $faker->words(rand(1,4))];
}
DB::table('songs')->insert($songs);
}
}
您需要将
SongsTableSeeder
放入文件 SongsTableSeeder.php
中,与您的 DatabaseSeeder.php
文件位于同一目录中。
并且您需要在控制台中运行:
composer dump-autoload
生成新的类映射,然后运行:
php artisan db:seed
我刚刚测试过。它在 Laravel 5 中运行没有问题
我通过这样做解决了这个问题:
发生这种情况是因为我更改了文件名。不知道为什么修改后就不行了
文件SongsTableSeeder.php应位于database/seeds目录或其子目录中。
你需要运行:
composer dump-autoload
然后:
php artisan db:seed
或:
php artisan db:seed --class=SongsTableSeeder
如果您迁移到
Laravel 8
,则必须向 namespace
类添加 seeders
:
<?php
namespace Database\Seeders;
...
接下来,在您的
composer.json
文件中,从 classmap
部分中删除 autoload
块,并添加新的命名空间类目录映射:
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Seeders\\": "database/seeds/"
}
},
最后,做一个
composer dump-autoload
。
欲了解更多信息: https://laravel.com/docs/8.x/upgrade#seeder-factory-namespaces
SongsTableSeeder.php 应该位于数据库/种子目录中
控制台命令步骤:
composer dump-autoload
然后:
php artisan cache:clear
然后:
php artisan optimize
然后:
php artisan db:seed
或:
php artisan db:seed --class=SongsTableSeeder
我正在运行最新的 Laravel 5 开发版本,如果您更改了命名空间,则需要像这样调用种子类:
$this->call('\todoparrot\TodolistTableSeeder');
显然您需要将
todoparrot
替换为您指定的命名空间。否则我会收到原始问题中指出的相同错误。
不要忘记
composer dump-autoload
与自动加载有关
/ composer.json
的类映射部分。如果您需要更改播种机目录或使用多个目录来存储播种机,请注意这一点。
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
},
您可能指定了
.php
扩展名,但它没有找到您的课程。
我在做什么:
php artisan db:seed --class=RolesPermissionsTableSeeder.php
什么解决了我的问题: 我在做什么:
php artisan db:seed --class=RolesPermissionsTableSeeder
当您将项目迁移到
Laravel 8
并收到该错误时,您应该按照下面给出的一些步骤操作。
1.转到您的
composer.json
文件。
2.更改自动加载部分
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
到
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
"database/seeds",
"database/factories"
]
},
3.现在运行
composer dump-autoload
或composer update
命令
4.最后运行命令
php artisan db:seed
如果我们的 CustomTableSeeder 与 DatabaseSeeder 位于同一目录中,我们应该如下使用:
$this->call('database\seeds\CustomTableSeeder');
在我们的 DatabaseSeeder 文件中; 然后会抛出另一个错误:“未找到数据库类” 然后我们应该将数据库外观添加到我们的 CustomTableSeeder 文件中,如下所示:
use Illuminate\Support\Facades\DB;
它对我有用!
我只使用了单个文件,其中包含以下两个类:
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\Lesson;
use Faker\Factory as Faker;
class DatabaseSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//Lesson::truncate();
Model::unguard();
$this->call("LessonsTableSeeder");
}
}
class LessonsTableSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$faker = Faker::create();
foreach(range(1,30) as $index) {
Lesson::create(['title' => $faker->sentence(5), 'body' => $faker->paragraph(4)]);
}
}
}
如果您从任何其他项目复制了播种机文件,那么您需要运行 artisan 命令
php artisan db:seed
否则没问题。
我也得到了
[ReflectionException] Class Seeder does not exist
,当我使用composer dump-autoload
时,我在运行它时遇到了错误preg_match(): JIT compilation failed: no more memory
。
我所做的是在
php.ini中将
;pcre.jit=1
更改为pcre.jit=Off
!
您可以在终端中使用 php --ini
找到路径!
我使用的是带有 php 7.3 的 mac!希望对大家有所帮助!
只需更改:
$this->call('SongsTableSeeder')
到
$this->call(SongsTableSeeder::class)
我有同样的“反射异常”错误。解决方案是将类文件从开发人员复制到服务器,对我来说。愚蠢的错误,但考虑到我们处理的文件数量,很容易忘记每次都将它们复制到服务器。