首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Laravel找不到航海家播种机?

为什么Laravel找不到航海家播种机?
EN

Stack Overflow用户
提问于 2021-04-12 10:07:17
回答 4查看 2.5K关注 0票数 1

我在项目中进行迁移,而不是运行php artisan migrate,而是运行php artisan migrate:fresh,然后清除所有表和其中的数据。现在,我的DB有了所有的空白表,但是当我再次尝试为它添加种子时,我遇到了一个问题。我能用我制造的播种机播下种子,但我也使用航行器,我不能运行航行者播种机。

航行者医生说我应该运行这个命令来运行旅行者表的种子:

代码语言:javascript
运行
复制
php artisan db:seed --class=VoyagerDatabaseSeeder

但是,当我运行它时,它会给出以下错误:

代码语言:javascript
运行
复制
 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的结果

代码语言:javascript
运行
复制
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))

这是航海家播种机:

代码语言:javascript
运行
复制
<?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');
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-04-14 22:37:29

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

原因

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

解决方案

将旅行者种子器移到“种子机”文件夹中--与Laravel 8播种机相同的文件夹--并添加一个适当的名称空间(Database\Seeders)似乎解决了我们的问题(我认为移动它们是不必要的,但我们这样做是为了保持项目的清洁)。

我们现在可以使用这个命令,并且使用旅行者的种子器,就像我们使用任何其他的播种机一样。

请注意,我不是一个非常有经验的工程师,也不是一个经验丰富的旅行者,所以请稍许接受这个解决方案,并原谅我在回答中可能有错误:)

票数 4
EN

Stack Overflow用户

发布于 2021-04-12 10:24:02

首先运行以下命令

代码语言:javascript
运行
复制
php artisan voyager:install --with-dummy

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

然后在命令下面运行

代码语言:javascript
运行
复制
composer dump-autoload

然后运行您的命令

代码语言:javascript
运行
复制
php artisan db:seed --class=VoyagerDatabaseSeeder
票数 2
EN

Stack Overflow用户

发布于 2022-10-14 20:48:18

在将namespace Database\Seeders;添加到所有旅行者创建的se之后,能够运行命令

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67056520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档