方法“loadFactoriesFrom”已被弃用。

4

我最近升级到了 Laravel 8,但现在收到一个警告:

方法 'loadFactoriesFrom' 已经过时

我的文件结构如下:

myapp/
├── packages/
│   ├── package-1/
|   |   |── src/
|   |   |   |── databases/
|   |   |   |   |── factories
|   |   |   |   |   |── PackageModel11
|   |   |   |   |   |── PackageModel12
|   |   |   |   |── Package1ServiceProvider
|   |   |   |   └── migrations
|   |   |   |── models/
|   |   |   |── controllers/
|   |   |   |── migrations/
|   |   |   └── /
|   |   |── tests/
|   |   |── composer.json/
│   ├── app
│   ├── database/
│   ├── resources/
│   └── public/


为了加载我的自定义程序包,我使用各种函数。
<?php

namespace MyName\Package1;

use Illuminate\Support\ServiceProvider;

class Package1ServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->loadFactoriesFrom(['database/factories']);
        $this->loadRoutesFrom(__DIR__.'/routes.php');
        $this->loadMigrationsFrom(__DIR__.'/migrations');
        $this->loadViewsFrom(__DIR__.'/views', '');
        $this->publishes([
            __DIR__.'/views' => base_path('resources/views'),
        ]);
    }

    public function register()
    {
        // Register controllers Here 
    }
}

现在loadFactoriesFrom已经被弃用,我如何加载这些工厂呢?

更新

我在这里找到了如何连接模型和工厂,并且他们记录了如何重写newFactory()函数。

所以我在我的测试中有以下代码:

  public function testWithPermissionUserCanSaveNewOnlineAssessment()
  {
    $topic = ELearningTopic::factory()->create();
    $this->actingAs($this->user, 'api')
      ->post('api/e-learning/course-content/topics/.' . $topic->id . './online-assessments', [])
      ->assertStatus(401);
  }

我的工厂

class ELearningTopicFactory extends Factory
{
  public function definition()
  {
     return [
       'name' => 'Some name'
     ];
  }
}

我的模型

  use HasFactory;
  protected static function newFactory()
  {
    return ELearningTopicFactory::new();
  }

现在我遇到以下错误

找不到类 'App\ELearningTopic'

我可能缺少什么?为什么模型类没有被覆盖?

2个回答

2

Laravel 8改变了工厂的工作方式。

然而,如果您想在Laravel 8中使用旧的工厂样式,只需安装Laravel legacy-factories

此软件包为 Laravel 8.x+ 提供了对先前版本的 Laravel 工厂(<= 7.x)的支持。

要了解更多关于此问题的详细信息,请查看此Github链接


感谢您的建议,我在这里找到了更好的解决方案:https://laravel.com/docs/8.x/database-testing#connecting-factories-and-models。 - Owen Kelvin

0
我测试过了,它有效。
你可以将以下代码添加到ServiceProvider的register方法中:
namespace JobMetric\Setting;

use Illuminate\Database\Eloquent\Factories\Factory;

public function register(): void
{
    ...

    Factory::guessFactoryNamesUsing(function (string $modelName) {
        return "\\JobMetric\\Setting\\Factories\\" . class_basename($modelName) . 'Factory';
    });
}

我把这段代码放在了jobmetric/laravel-setting包中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接