为啥 php artisan make:factory 不使用模型生成

Posted

技术标签:

【中文标题】为啥 php artisan make:factory 不使用模型生成【英文标题】:Why is php artisan make:factory not Generating with a Model为什么 php artisan make:factory 不使用模型生成 【发布时间】:2022-01-15 11:38:13 【问题描述】:

长话短说,我的 Larvel 8 (Jetstream) 应用程序中有一个名为 Board 的模型。我正在尝试为这个 Board 模型生成一个工厂。

当我使用以下任一命令时:

php artisan make:factory BoardFactory

php artisan make:factory BoardFactory --model=Board

我生成了一个看起来没有错误或问题的工厂类。但是,当我打开该类时,它与模型无关。

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

class BoardFactory extends Factory
    /**
     * Define the model's default state. 
     *
     * @return array
     */
    public function definition()
    
        return [
            //
        ];
    

我已经对我的应用程序中的所有模型进行了尝试,并且这种情况仍然存在。再次没有错误说找不到模型。该命令看似成功运行,但显然没有为模型生成工厂。

我知道如果需要我可以轻松地手动编写它,但我想了解为什么它不起作用以及如何解决它。我通过测试的速度越快……越好:)

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

尝试发布您的 laravel 存根并确认存根文件内容已按预期定义。

    发布存根。

php artisan stub:publish

这应该在根项目目录中创建一个 /stubs 文件夹。 在该文件夹中,您将看到所有存根。
    具体来说,打开名为 factory.stubstub 文件
它的文件内容应该类似于:
<?php

namespace  factoryNamespace ;

use Illuminate\Database\Eloquent\Factories\Factory;
use  namespacedModel ;

class  factory Factory extends Factory

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

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    
        return [
            //
        ];
    


注意事项:

从外观上看,您当前的工厂存根似乎缺少以下部分:

// ...
use  namespacedModel ;
// ...

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

// ...

理想情况下,在正常(默认)情况下,运行生成带有链接模型的工厂的命令应如下所示:

命令:

php artisan make:factory BoardFactory --model=Board

预期输出文件(database/factories/BoardFactory.php):

<?php

namespace Database\Factories;

use App\Models\Board;
use Illuminate\Database\Eloquent\Factories\Factory;

class BoardFactory extends Factory

    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Board::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    
        return [
            //
        ];
    


附录:

正如@miken32 的评论中所指出的,在2021 年 10 月 22 日之后发布的 Laravel 版本中,不再需要在 Factory 类中声明模型属性:

Laravel Pull Request

此时,数据库工厂有这个隐藏的特性 可以“猜测”数据库模型。

因此,此拉取请求建议从 工厂stub,可能当前的“猜测”逻辑适用于 99.99% 的人。此外,我还向 我们从中删除 protected $model = User::class 的骨架 UserFactory.php: laravel/laravel#5713.

【讨论】:

太棒了,谢谢你这完美的工作。我不知道存根,但它与您显示的完全一样。缺少模型属性 - 谢谢。 @robby11110 ,我很高兴能帮上忙。?

以上是关于为啥 php artisan make:factory 不使用模型生成的主要内容,如果未能解决你的问题,请参考以下文章

为啥“php artisan serve”关闭端口? (也不住8000)

为啥我收到 Laravel php artisan 迁移错误?

为啥 php artisan make:factory 不使用模型生成

为啥 php artisan 使用 empty up 方法创建迁移类?

为啥作曲家更新后php artisan命令不起作用

为啥我不能使用 PHP artisan serve 运行我的 laravel 应用程序?