为什么 Laravel 找不到 Voyager Seeder?

问题描述

我正在我的项目中进行迁移,而不是运行 PHP artisan migrate,而是运行了 PHP artisan migrate:fresh,然后这会清除我的所有表和其中的数据。现在我的数据库有所有空白表,但现在我在尝试再次播种时遇到了问题。我可以用我制作的播种机播种,但我也在使用 voyager,我无法运行 voyager 播种机。

voyager docs 说我应该运行这个命令来运行 voyager 表的种子:

PHP artisan db:seed --class=VoyagerDatabaseSeeder

但是当我运行它时,它给了我以下错误

 Illuminate\Contracts\Container\BindingResolutionException 

  Target class [Database\Seeders\VoyagerDatabaseSeeder] does not exist.

  at vendor/laravel/framework/src/Illuminate/Container/Container.PHP:835
    831▕ 
    832▕         try {
    833▕             $reflector = new ReflectionClass($concrete);
    834▕         } catch (ReflectionException $e) {
  ➜ 835▕             throw new BindingResolutionException("Target class [$concrete] does not exist.",$e);
    836▕         }
    837▕ 
    838▕         // If the type is not instantiable,the developer is attempting to resolve
    839▕         // an abstract type such as an Interface or Abstract Class and there is

      +23 vendor frames 
  24  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))

这就是我的目录布局:

enter image description here

您可以看到 VoyagerDatabaseSeeder.PHP 确实存在,但出于某种原因,laravel 无法播种它?有什么想法吗?

----------- 评论 [ composer dump-autoload ] -------------

这是来自composer dump-autoload的结果:

mobile-mastery-latest git:(enhancement/auth-user) ✗ composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @PHP artisan package:discover --ansi
discovered Package: arrilot/laravel-widgets
discovered Package: bumbummen99/shoppingcart
discovered Package: cartalyst/stripe-laravel
discovered Package: facade/ignition
discovered Package: fideloper/proxy
discovered Package: fruitcake/laravel-cors
discovered Package: intervention/image
discovered Package: larapack/doctrine-support
discovered Package: larapack/voyager-hooks
discovered Package: laravel/tinker
discovered Package: laravel/ui
discovered Package: nesbot/carbon
discovered Package: nunomaduro/collision
discovered Package: tcg/voyager
Package manifest generated successfully.
Generated optimized autoload files containing 5855 classes
➜  mobile-mastery-latest git:(enhancement/auth-user) ✗ PHP artisan db:seed --class=VoyagerDatabaseSeeder

   Illuminate\Contracts\Container\BindingResolutionException 

  Target class [Database\Seeders\VoyagerDatabaseSeeder] does not exist.

  at vendor/laravel/framework/src/Illuminate/Container/Container.PHP:835
    831▕ 
    832▕         try {
    833▕             $reflector = new ReflectionClass($concrete);
    834▕         } catch (ReflectionException $e) {
  ➜ 835▕             throw new BindingResolutionException("Target class [$concrete] does not exist.",Object(Symfony\Component\Console\Output\ConsoleOutput))

-----------评论[添加use语句] -------------

这是航海者播种机:

<?PHP

use Illuminate\Database\Seeder;
use TCG\Voyager\Traits\Seedable;

class VoyagerDatabaseSeeder extends Seeder
{
    use Seedable;

    protected $seedersPath = __DIR__.'/';

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->seed('DataTypestableSeeder');
        $this->seed('DaTarowsTableSeeder');
        $this->seed('MenusTableSeeder');
        $this->seed('MenuItemsTableSeeder');
        $this->seed('RolesTableSeeder');
        $this->seed('PermissionsTableSeeder');
        $this->seed('PermissionRoleTableSeeder');
        $this->seed('SettingsTableSeeder');
    }
}

解决方法

首先运行这个命令

php artisan voyager:install --with-dummy

此命令创建您开始使用 Voyager 所需的所有表和角色

然后运行下面的命令

composer dump-autoload

然后运行你的命令

php artisan db:seed --class=VoyagerDatabaseSeeder
,

所以我们偶然发现了这个问题,我们只能找到解决方法。

原因

看起来在 Laravel 7 中创建的播种机没有命名空间,就像 Voyager 的播种机一样。但 Laravel 8 的情况并非如此。现在,Laravel 正在 namespace Database\Seeders; 中寻找 Seeders - 因此当您尝试运行 php artisan db:seed --class=VoyagerDatabaseSeeder 时,它将无法找到它,因为它不在它正在寻找的命名空间。

解决方案

将 Voyager 播种机移动到“播种机”文件夹 - 与 Laravel 8 播种机所在的文件夹相同 - 并添加适当的命名空间(Database\Seeders)似乎解决了我们的问题(我认为没有必要移动它们,但我们这样做是为了保持项目清洁)。


我们现在可以使用该命令,并且可以像使用任何其他播种机一样使用 Voyager 播种机。

请注意,我不是一个非常有经验的工程师,也不是 Voyager 经验丰富的人,所以请对这个解决方案持保留态度,并原谅我的答案可能不准确:)