簡體   English   中英

為什么 Laravel 找不到 Voyager Seeder?

[英]Why can't Laravel find the Voyager Seeder?

我正在我的項目中進行遷移,而不是運行php artisan migrate我運行了php artisan migrate:fresh然后清除了我所有的表和其中的數據。 現在我的數據庫有所有空白表,但是當我再次嘗試播種時遇到了問題。 我可以用我制作的播種機播種,但我也在使用 voyager,我無法運行 voyager 播種機。

voyager 文檔說我應該運行這個命令來運行 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的結果:

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 中創建了 7 個播種器,沒有命名空間,就像 Voyager 的播種器一樣。 但 Laravel 8 的情況並非如此。現在,Laravel 正在namespace Database\Seeders; - 因此,當您嘗試運行php artisan db:seed --class=VoyagerDatabaseSeeder時,它將無法找到它,因為它不在它正在尋找的命名空間中。

解決方案

將 Voyager 播種機移動到“播種機”文件夾 - 與 Laravel 8 播種機相同的文件夾 - 並添加適當的命名空間( Database\Seeders )似乎解決了我們的問題(我認為移動它們是沒有必要的,但我們這樣做是為了保持項目清潔)。


我們現在可以使用該命令,並像使用任何其他播種機一樣使用 Voyager 播種機。

請注意,我不是一位經驗豐富的工程師,也不是 Voyager 的經驗,所以請對這個解決方案持保留態度,並原諒我在答案中可能存在的不准確之處:)

首先運行這個命令

php artisan voyager:install --with-dummy

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

然后運行下面的命令

composer dump-autoload

然后運行你的命令

php artisan db:seed --class=VoyagerDatabaseSeeder

1. 運行: composer dump-autoload 2. 運行: php artisan voyager:install --with-dummy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM