为什么 Laravel 找不到 Voyager Seeder?
Why can't Laravel find the Voyager Seeder?
我正在我的项目中进行迁移,而不是 运行ning 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
的结果:
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');
}
}
首先运行这个命令
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;
中寻找播种机 - 因此当您尝试 运行 php artisan db:seed --class=VoyagerDatabaseSeeder
时,它将无法找到它,因为它不在它的命名空间中正在寻找。
解决方案
将 Voyager 播种机移至“播种机”文件夹 - 与 Laravel 8 播种机相同的文件夹 - 并添加适当的命名空间 (Database\Seeders
) 似乎已经解决了我们的问题(我认为移动它们是没有必要,但我们这样做是为了保持项目干净。
我们现在可以使用该命令,并像使用任何其他播种机一样使用 Voyager 播种机。
请注意,我不是一个非常有经验的工程师,也没有使用 Voyager 的经验,所以请对这个解决方案持保留态度,请原谅我在答案中可能存在的不准确之处:)
1. 运行:
作曲家 dump-autoload
2。 运行:
php artisan voyager:install --with-dummy
我正在我的项目中进行迁移,而不是 运行ning 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
的结果:
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');
}
}
首先运行这个命令
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;
中寻找播种机 - 因此当您尝试 运行 php artisan db:seed --class=VoyagerDatabaseSeeder
时,它将无法找到它,因为它不在它的命名空间中正在寻找。
解决方案
将 Voyager 播种机移至“播种机”文件夹 - 与 Laravel 8 播种机相同的文件夹 - 并添加适当的命名空间 (Database\Seeders
) 似乎已经解决了我们的问题(我认为移动它们是没有必要,但我们这样做是为了保持项目干净。
我们现在可以使用该命令,并像使用任何其他播种机一样使用 Voyager 播种机。
请注意,我不是一个非常有经验的工程师,也没有使用 Voyager 的经验,所以请对这个解决方案持保留态度,请原谅我在答案中可能存在的不准确之处:)
1. 运行: 作曲家 dump-autoload 2。 运行: php artisan voyager:install --with-dummy