iT邦幫忙

0

Laravel 運行 php artisan db:seed --class ***Seeder 始終報錯:Target class [****Seeder] does not exist.求解

我想要用seeder 產生一些測試資料,因此
首先我執行

php artisan make:seeder 88asSeeder

結果檔案生成都正常如圖
https://ithelp.ithome.com.tw/upload/images/20200111/20121754wO4ESueVIu.png
然後我寫好for 迴圈之後,先執行

composer dump_autoload

結果顯示也正常

Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 4077 classes

然後我執行db:seed

php artisan db:seed --class 88asSeeder

就一直報錯了如下:

  Illuminate\Contracts\Container\BindingResolutionException  : Target class [88asSeeder] does not exist.

  at C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\Container.php:805
    801|
    802|         try {
    803|             $reflector = new ReflectionClass($concrete);
    804|         } catch (ReflectionException $e) {
  > 805|             throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
    806|         }
    807|
    808|         // If the type is not instantiable, the developer is attempting to resolve
    809|         // an abstract type such as an Interface or Abstract Class and there is

  Exception trace:

  1   ReflectionException::("Class 88asSeeder does not exist")
      C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\Container.php:803

  2   ReflectionClass::__construct("88asSeeder")
      C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\Container.php:803

  Please use the argument -v to see more details.

如上,有請哪位高手解迷津,幫幫忙!

1 個回答

1
小魚
iT邦大師 1 級 ‧ 2020-01-11 18:10:46
最佳解答

是不是,
不能用數字開頭?
一般來說好像都用英文開頭.
很多地方都不能用數字開頭.

看更多先前的回應...收起先前的回應...

我把 88asSeeder 改成 asSeeder後,報錯已經不一樣了如下:

   Symfony\Component\Debug\Exception\FatalThrowableError  : Call to undefined function Str_random()

  at C:\AppServ\www\3zzz\etk\database\seeds\asSeeder.php:19
    15|         $arr = [];
    16|         for ($i=0; $i <20 ; $i++) {
    17|                 # code...
    18|                 $tmp = [];
  > 19|                 $tmp['username'] = Str_random(20);
    20|                 $tmp['password'] = Str_random(20);
    21|                 $tmp['email'] = rand(100000, 9999999).'@gmail.com';
    22|                 $arr[] = $tmp;
    23|         }

  Exception trace:

  1   asSeeder::run()
      C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:32

  2   call_user_func_array([])
      C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:32

  Please use the argument -v to see more details.

可見似乎是 class 不存在的問題 已經好了,但新的問題是? 能否也指點一下迷津!謝謝!

小魚 iT邦大師 1 級 ‧ 2020-01-11 19:05:37 檢舉

他找不到 Str_random 這個 function啊,
你function放在哪裡?
如果是同一個檔案的話可以嘗試在前面加
$this-> 或 $this::

###str_random 不是 Laravel 封裝的全局函數嗎?

我沒有定義 Str_random 、tr_random 或 任何函數,難道是我還需要引入甚麼嗎?

另外:
我使用 $tmp['email'] = rand(100, 9999).'@gmail.com';
想要產生一些亂數的 email ,也好像有問題,因為生成的資料如下圖:
https://ithelp.ithome.com.tw/upload/images/20200111/2012175435kQ1JxITz.png

在" @gmail.com" 之前的數字,怎麼都一樣 rand(100000, 9999999)
不是會從100000~9999999之間亂數產生嗎?

加了$this:: 或是 $this->

<?php

use Illuminate\Database\Seeder;

class asSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
        $arr = [];
        for ($i=0; $i <20 ; $i++) { 
        	# code...
        	$tmp = [];
        	$tmp['username'] = $this::str_random(10);
        	$tmp['password'] = $this::srand(0, 1);
        	$tmp['email'] = $this::rand(100, 9999).'@gmail.com';
        	$arr[] = $tmp;
        }

        	DB::table('as')->insert($arr);
    }
}

以後,變成報錯如下

  Symfony\Component\Debug\Exception\FatalThrowableError  : Call to undefined method asSeeder::str_random()

  at C:\AppServ\www\3zzz\etk\database\seeds\asSeeder.php:19
    15|         $arr = [];
    16|         for ($i=0; $i <20 ; $i++) {
    17|                 # code...
    18|                 $tmp = [];
  > 19|                 $tmp['username'] = $this::str_random(10);
    20|                 $tmp['password'] = $this::srand(0, 1);
    21|                 $tmp['email'] = $this::rand(100, 9999).'@gmail.com';
    22|                 $arr[] = $tmp;
    23|         }
小魚 iT邦大師 1 級 ‧ 2020-01-11 19:58:14 檢舉

喔喔,
看到str_random了,
這個沒用過,
應該也是要引用什麼類,
這你要查一下,
那就不能用$this了.

另外你會重複應該是因為$tmp是同一個,
你嘗試看看直接用$i變數看寫入資料庫變怎麼樣?
新增陣列可以考慮array_push.

str_random 用得有問題的話 試試這個吧
https://laravel.com/docs/master/helpers#method-str-random
不過產生測試資料不是用 factory 更好嗎?
email 還會照格式幫你產生
此外,很多程式語言 class 名稱只接受大寫英文字母開頭,部分接受小寫,數字開頭幾乎沒見過

因為剛接觸 所以 factory 也還需要摸索一下, Seeder 先學會了有空再研究factory。

昨天經小魚大大提醒把表名去掉數字換成全英文後,找不到class 問題已經解決。
而剛剛我參考了f107110126提供的資料然後
將aaaSeeder中的 str_random 換成 str::random 如下:
https://ithelp.ithome.com.tw/upload/images/20200112/20121754sCEdjjnOze.png
再執行

composer dump-autoload

以及

php artisan db:seed --class=aaaSeeder

結果完全OK如下圖:
https://ithelp.ithome.com.tw/upload/images/20200112/20121754xjeI21csyW.png
真棒!感謝兩位賜教,令人感覺處處有溫情,溫暖技術圈。謝謝啦!

我要發表回答

立即登入回答