【问题标题】:Why can't Laravel find the Voyager Seeder?为什么 Laravel 找不到 Voyager Seeder?
【发布时间】:2021-07-07 10:11:00
【问题描述】:

我正在我的项目中进行迁移,而不是运行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.", 0, $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))

这就是我的目录的布局方式:

您可以看到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.", 0, $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))

----------- 评论[添加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');
    }
}

【问题讨论】:

  • 如果你使用的是 laravel 8,那么在你的 VoyagerDatabaseSeeder.php 文件的顶部添加这一行 use Illuminate\Database\Seeder;
  • @EsTeAa 已包含在文件中,我已将其添加到问题中

标签: php laravel voyager


【解决方案1】:

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

原因

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

解决方案

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


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

请注意,我不是一位经验丰富的工程师,也不是 Voyager 方面的经验,所以请对这个解决方案持保留态度,并原谅我在答案中可能存在的不准确之处:)

【讨论】:

    【解决方案2】:

    首先运行这个命令

    php artisan voyager:install --with-dummy
    

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

    然后运行下面的命令

    composer dump-autoload
    

    然后运行你的命令

    php artisan db:seed --class=VoyagerDatabaseSeeder
    

    【讨论】:

    • 这不起作用,我已更新我的问题以包含此结果!
    • 这仍然给我错误,它的意思是:目标类 [D​​atabase\Seeders\VoyagerDatabaseSeeder] 不存在。
    • 如果上述答案不起作用,因为我们使用的是 laravel 8 现在您需要将所有种子文件从种子文件夹移动到播种器文件夹,然后检查其是否正常工作。正如您所看到的错误,它在播种器文件夹中查找类 "Target class [Database\Seeders\VoyagerDatabaseSeeder] 不存在" 。您还可以使用种子运行转储自动加载和全新迁移,
    【解决方案3】:

    1.运行: 作曲家转储自动加载 2。运行: php artisan voyager:install --with-dummy

    【讨论】:

    • 这个答案已经在几个小时前给出了更多的细节和更好的格式。
    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2021-02-07
    • 2021-04-21
    • 2017-11-17
    • 2016-05-06
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多