未定义的变量:工厂 Laravel 8 Livewire

1 php database shopping-cart virtualbox laravel-livewire

我是 Laravel/Livewire/Jetstream 的新手,我正在尝试按照本[教程](https://lightit.io/blog/laravel-livewire-shopping-cart-demo/)创建一个购物车项目。我在虚拟机中使用 Laravel 8/ OS Ubuntu。\n当我尝试运行此命令时,出现异常错误“未定义的变量:工厂”php artisan migrate:fresh --seed

\n

错误内容

\n
Seeding: Database\\Seeders\\ProductSeeder\n\n   ErrorException \n\n  Undefined variable: factory\n\n  at database/factories/ProductFactory.php:7\n      3\xe2\x96\x95 /** @var \\Illuminate\\Database\\Eloquent\\Factory $factory */\n      4\xe2\x96\x95 use App\\Models\\Product;\n      5\xe2\x96\x95 use Faker\\Generator as Faker;\n      6\xe2\x96\x95 \n  \xe2\x9e\x9c   7\xe2\x96\x95 $factory->define(Product::class, function (Faker $faker) {\n      8\xe2\x96\x95     return [\n      9\xe2\x96\x95         \'name\' => $faker->word,\n     10\xe2\x96\x95         \'description\' => $faker->text(180),\n     11\xe2\x96\x95         \'price\' => $faker->numberBetween(50, 100)\n\n  1   database/factories/ProductFactory.php:7\n      Illuminate\\Foundation\\Bootstrap\\HandleExceptions::handleError()\n\n      +2 vendor frames \n  4   [internal]:0\n      Composer\\Autoload\\ClassLoader::loadClass()\n
Run Code Online (Sandbox Code Playgroud)\n

作曲家.json 文件

\n
 "autoload": {\n    "psr-4": {\n        "App\\\\": "app/",\n        "Database\\\\Factories\\\\": "database/factories/",\n        "Database\\\\Seeders\\\\": "database/seeders/"\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

数据库/迁移/xxxx_xx_xx_xxxxxx_create_products_table.php

\n
<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nclass CreateProductsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create(\'products\', function (Blueprint $table) {\n            $table->id();\n\n            $table->string(\'name\');\n            $table->string(\'description\');\n            $table->float(\'price\');\n            \n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists(\'products\');\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

数据库/工厂/ProductFactory.php

\n
    <?php\n\n/** @var \\Illuminate\\Database\\Eloquent\\Factory $factory */\nuse App\\Models\\Product;\nuse Faker\\Generator as Faker;\n\n$factory->define(Product::class, function (Faker $faker) {\n    return [\n        \'name\' => $faker->word,\n        \'description\' => $faker->text(180),\n        \'price\' => $faker->numberBetween(50, 100)\n    ];\n});\n
Run Code Online (Sandbox Code Playgroud)\n

数据库/seeders/ProductSeeder.php

\n
    <?php\nnamespace Database\\Seeders;\n\nuse App\\Models\\Product;\nuse Illuminate\\Database\\Seeder;\n\nclass ProductSeeder extends Seeder\n{\n    /**\n     * Run the database seeds.\n     *\n     * @return void\n     */\n    public function run()\n    {\n        \\App\\Models\\Product::factory()->count(50)->create();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

数据库/seeders/DatabaseSeeder.php

\n
    <?php\n\nuse Database\\Seeders\\ProductSeeder;\nuse Illuminate\\Database\\Seeder;\n\n\nclass DatabaseSeeder extends Seeder\n\'{\n    /**\n     * Seed the application\'s database.\n     *\n     * @return void\n     */\n    public function run()\n    {\n        $this->call(ProductSeeder::class);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

你能帮助我理解我做错了什么吗?

\n

谢谢

\n

Dig*_*jay 10

ProductFactory::class似乎遵循 Laravel 7 约定。Laravel 8 模型工厂功能已完全重写以支持类,并且与 Laravel 7.x 样式工厂不兼容。

您可以执行以下操作:

<?php

namespace Database\Factories;

use App\Models\Product;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class ProductFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Product::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'description' => $this->faker->realText(180),
            'price' => $this->faker->numberBetween(50, 100)
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

Product Model此外,您还需要更新:

use Illuminate\Database\Eloquent\Factories\HasFactory;

class Product extends Model
{
    use HasFactory;
Run Code Online (Sandbox Code Playgroud)