当我运行 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);
}
}
composer dump-autoload
?
SongsTableSeeder
类定义的文件的路径是什么?
您需要将 SongsTableSeeder
放入您拥有 DatabaseSeeder.php
文件的同一目录中的文件 SongsTableSeeder.php
中。
你需要在你的控制台中运行:
composer dump-autoload
生成新的类映射,然后运行:
php artisan db:seed
我刚刚测试过了。它在 Laravel 5 中没有问题
我通过这样做解决了它:
复制文件内容。删除文件。运行命令: php artisan make:seeder 。将文件内容复制回此文件中。
发生这种情况是因为我更改了文件名。我不知道为什么它在更改后不起作用。
composer dump-autoload
对我不起作用。我必须重新创建播种机类以使其正常工作。
文件 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
文件中,从 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 应该在 database/seeds 目录中
控制台命令步骤:
composer dump-autoload
接着:
php artisan cache:clear
接着:
php artisan optimize
接着:
php artisan db:seed
或者:
php artisan db:seed --class=SongsTableSeeder
php artisan optimize
部分
我正在运行最新的 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
如果我们的 CustomTableSeeder 与 DatabaseSeeder 在同一目录中,我们应该使用如下:
$this->call('database\seeds\CustomTableSeeder');
在我们的 DatabaseSeeder 文件中;然后会抛出另一个错误,上面写着:'DB Class not found' 然后我们应该将我们的 DB 外观添加到我们的 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)]);
}
}
}
如果您从任何其他项目复制了播种机文件,则需要运行工匠命令 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!希望对你们中的任何人有帮助!
当您将项目迁移到 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
的命令
我有同样的“反射异常”错误。解决方案是为我将类文件从 dev 复制到服务器。愚蠢的错误,但考虑到我们处理了多少文件,很容易忘记每次都将它们复制到服务器。
不定期副业成功案例分享
composer dumpautoload
也会飞dump-autoload
重新生成需要包含在项目中的所有类的列表,当您在项目中有一个新类时使用它。通常运行make:*
将添加新创建的类,但如果您手动创建播种器,则不会发生这种情况。至少这就是我从 5 分钟的搜索中理解它的工作方式。我不是专家。composer dump-autoload
为我工作。