当我运行php artisan db:seed时,我收到以下错误:
[ReflectionException] Class SongsTableSeeder does not exist
这是怎么回事?
我的数据库播种器类:
<?php
use IlluminateDatabaseSeeder;
use IlluminateDatabaseEloquentModel;
class DatabaseSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
$this->call('SongsTableSeeder');
}
}
我的歌曲表播种机类:
<?php
// Composer: "fzaninotto/faker": "v1.4.0"
use FakerFactory as Faker;
use IlluminateDatabaseSeeder;
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 中工作没有问题
我通过这样做解决了它:
- 复制文件内容。
- 删除文件。
- 运行命令:php 工匠制作:播种机。
- 将文件内容复制回此文件中。
发生这种情况是因为我更改了文件名。我不知道为什么更改后它不起作用。
File SongsTableSeeder.php 应该在 database/seeds 目录或其子目录中。
您需要运行:
composer dump-autoload
然后:
php artisan db:seed
或:
php artisan db:seed --class=SongsTableSeeder
如果您迁移到 Laravel 8
,则必须向seeders
类添加一个namespace
:
<?php
namespace DatabaseSeeders;
...
接下来,在composer.json
文件中,从autoload
部分中删除classmap
块,并添加新的命名空间类目录映射:
"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('todoparrotTodolistTableSeeder');
显然,您需要将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('databaseseedsCustomTableSeeder');
在我们的数据库播种器文件中;然后将抛出另一个错误,说:"找不到数据库类"然后我们应该将我们的数据库外观添加到我们的 CustomTableSeeder 文件中,如下所示:
use IlluminateSupportFacadesDB;
它对我有用!
我只使用了带有两个类的单个文件:
use IlluminateDatabaseSeeder;
use IlluminateDatabaseEloquentModel;
use AppLesson;
use FakerFactory 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)]);
}
}
}
如果您从任何其他项目复制了播种机文件,则需要运行工匠命令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)
我遇到了同样的"反射异常"错误。解决方案是将类文件从 dev 复制到服务器,对我来说。愚蠢的错误,但考虑到我们处理的文件数量,每次都很容易忘记将它们复制到服务器。