Laravel 5 - เมล็ดพันธุ์ช่าง [ReflectionException] คลาสเพลง TableSeeder ไม่มีอยู่


275

เมื่อฉันเรียกใช้db artisan db: เมล็ดฉันได้รับข้อผิดพลาดต่อไปนี้:

[ReflectionException] Class SongsTableSeeder does not exist

เกิดอะไรขึ้น?

คลาส DatabaseSeederของฉัน:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder {

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();

        $this->call('SongsTableSeeder');
    }

}

เพลงของฉันTableSeeder

<?php

// Composer: "fzaninotto/faker": "v1.4.0"
use Faker\Factory as Faker;
use Illuminate\Database\Seeder;
use DB;

class SongsTableSeeder extends Seeder {

    public function run()
    {
        $faker = Faker::create();
        $songs = [];
        foreach(range(1, 10) as $index)
        {
            $songs[] = ['title' => $faker->words(rand(1,4))];
        }

        DB::table('songs')->insert($songs);

    }

}

108
composer dump-autoload?
โทมัสเซ่น

ฉันคิดว่าใช้ Faker \ Factory เป็น Faker ทำงานอะไร
Sasha

เส้นทางไปยังไฟล์ที่มีSongsTableSeederคำจำกัดความของชั้นเรียนคืออะไร?
Wouter J


นี่คือการถ่ายโอนข้อมูลและไม่ดี
Luigi Lopez

คำตอบ:


749

คุณต้องใส่SongsTableSeederไฟล์ลงSongsTableSeeder.phpในไดเรกทอรีเดียวกันกับDatabaseSeeder.phpไฟล์ของคุณ

และคุณต้องทำงานในคอนโซลของคุณ:

composer dump-autoload

เพื่อสร้างแผนที่ชั้นใหม่แล้วเรียกใช้:

php artisan db:seed

ฉันเพิ่งทดสอบมัน มันทำงานได้โดยไม่มีปัญหาใน Laravel 5


1
ฉันไม่ได้ใช้ 'แบบจำลอง' ในคลาส seeder ของฉัน ทำงานได้ดีในขณะนี้
Jamie Poole

1
composer dumpautoloadยังบิน
คอนเนอร์ปลัด

นักแต่งเพลง dump-autoload แก้ปัญหาให้ฉัน นักแต่งเพลง dump-autoload ทำอะไรจริงๆ?
Luís Almeida

5
@ LuísAlmeidaจะdump-autoloadสร้างรายการของคลาสทั้งหมดที่ต้องรวมไว้ในโครงการซึ่งจะใช้เมื่อคุณมีคลาสใหม่ในโครงการของคุณ โดยปกติแล้วการรันmake:*จะเพิ่มคลาสที่สร้างขึ้นใหม่ แต่สิ่งนี้จะไม่เกิดขึ้นหากคุณสร้าง seeder ด้วยตนเอง อย่างน้อยนั่นเป็นวิธีที่ฉันเข้าใจเพื่อให้ทำงานได้จากการค้นหา 5 นาที ฉันไม่ใช่ผู้เชี่ยวชาญ
Xander Luciano

ฉันลองโซลูชันนี้กับ Laravel 5.8 บนเซิร์ฟเวอร์การพัฒนาและcomposer dump-autoloadทำงานให้ฉัน
Mycodingproject

19

ฉันแก้ไขมันโดยทำสิ่งนี้:

  1. คัดลอกเนื้อหาไฟล์
  2. ลบไฟล์
  3. เรียกใช้คำสั่ง: php artisan make: seeder
  4. คัดลอกเนื้อหาไฟล์กลับมาในไฟล์นี้

สิ่งนี้เกิดขึ้นเพราะฉันทำการเปลี่ยนแปลงชื่อไฟล์ ฉันไม่รู้ว่าทำไมมันไม่ทำงานหลังจากการเปลี่ยนแปลง


2
อาจเป็นไปได้ที่การเรียบเรียงอัตโนมัติของนักแต่งเพลง โปรแกรมโหลดอัตโนมัติกำลังมองหาไฟล์ที่เก่ากว่า ดังนั้นหากคุณถ่ายโอนไฟล์นี้ผ่านบรรทัดคำสั่งมันจะสร้างไฟล์ออโต้โหลดใหม่พร้อมไฟล์ใหม่ ดังนั้นในอนาคตลองนี่ =)
Ron van Asseldonk

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับนักแต่งเพลงอัตโนมัติโหลดดูที่เว็บไซต์นี้: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk

Van Asseldok เอ่อcomposer dump-autoloadไม่ได้ผลสำหรับฉัน ฉันต้องสร้างคลาส seeder ใหม่เพื่อให้ทำงานได้
М.Б.

สิ่งนี้ช่วยฉัน 'นักแต่งเพลงการถ่ายโอนข้อมูลอัตโนมัติ' ไม่ทำงานสำหรับฉันเช่นกันสิ่งที่จะทำกับการตั้งค่าเซิร์ฟเวอร์ของฉันหรือความจริงที่ว่ามันเป็นเซิร์ฟเวอร์ที่ใช้ร่วมกัน
Derk Jan Speelman

16

ไฟล์SongsTableSeeder.phpควรอยู่ในไดเรกทอรีฐานข้อมูล / เมล็ดพืชหรือในไดเรกทอรีย่อย

คุณต้องเรียกใช้:

composer dump-autoload

แล้ว:

php artisan db:seed

หรือ:

php artisan db:seed --class=SongsTableSeeder

1
สามารถดูข้อผิดพลาดในการแยกวิเคราะห์ด้วยคำสั่ง 'php artisan db: seed --class = SongsTableSeeder' thnks !!
OmiK

4

SongsTableSeeder.php ควรอยู่ในไดเรกทอรีฐานข้อมูล / เมล็ด

ขั้นตอนคำสั่งคอนโซล:

composer dump-autoload

แล้ว:

php artisan cache:clear

แล้ว:

php artisan optimize

แล้ว:

php artisan db:seed

หรือ:

php artisan db:seed --class=SongsTableSeeder

ทำงานให้ฉัน! โดยเฉพาะอย่างยิ่งphp artisan optimizeส่วน
Moses Ndeda

3

ฉันกำลังเปิดตัว Laravel 5 dev ล่าสุดและหากคุณเปลี่ยนเนมสเปซคุณจะต้องเรียกคลาสเมล็ดพันธุ์ของคุณเช่นนี้:

$this->call('\todoparrot\TodolistTableSeeder');

แน่นอนคุณจะต้องแทนที่todoparrotด้วยเนมสเปซที่คุณกำหนด มิฉะนั้นฉันจะได้รับข้อผิดพลาดเดียวกับที่ระบุไว้ในคำถามเดิม


3

อย่าลืมว่าcomposer dump-autoloadการทำงานในความสัมพันธ์กับส่วน AUTOLOAD / ClassMap composer.jsonของ โปรดระวังหากคุณต้องการเปลี่ยนไดเร็กทอรี seeders หรือใช้หลายไดเร็กทอรีเพื่อเก็บ seeders

"autoload": {
    "classmap": [
      "database/seeds",
      "database/factories"
    ],
},

0

หาก CustomTableSeeder ของเราอยู่ในไดเรกทอรีเดียวกันกับ DatabaseSeeder เราควรใช้ดังนี้:

$this->call('database\seeds\CustomTableSeeder');

ในไฟล์ DatabaseSeeder ของเรา; จากนั้นข้อผิดพลาดอื่นจะถูกโยนที่ระบุว่า: 'ไม่พบคลาส DB' จากนั้นเราควรเพิ่มส่วนหน้าฐานข้อมูลของเราในไฟล์ CustomTableSeeder ของเราดังนี้

use Illuminate\Support\Facades\DB;

มันใช้งานได้สำหรับฉัน!


0

ฉันใช้ไฟล์ SINGLE FILE เดียวกับสองชั้นเท่านั้นแล้ว:

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\Lesson;

use Faker\Factory as Faker;

class DatabaseSeeder extends Seeder {

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    //Lesson::truncate();

    Model::unguard();

    $this->call("LessonsTableSeeder");


}

}

class LessonsTableSeeder extends Seeder {

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{

    $faker = Faker::create();

    foreach(range(1,30) as $index) {

        Lesson::create(['title' => $faker->sentence(5), 'body' => $faker->paragraph(4)]);

    }

}

}

0

หากคุณคัดลอกไฟล์ seeders จากโปรเจ็กต์อื่นคุณต้องรันคำสั่ง artisan php artisan db:seedมิฉะนั้นจะใช้ได้


0

ฉันได้รับ[ReflectionException] Class Seeder does not existมากเกินไปและเมื่อฉันใช้composer dump-autoloadฉันได้รับข้อผิดพลาดpreg_match(): JIT compilation failed: no more memoryเมื่อฉันเรียกใช้

สิ่งที่ฉันได้คือการที่ฉันจะเปลี่ยน;pcre.jit=1ไปpcre.jit=Offในphp.ini ! คุณสามารถค้นหาเส้นทางโดยใช้php --iniใน terminal ของคุณ!

ฉันใช้ mac กับ php 7.3! หวังว่าจะช่วยพวกคุณทุกคนที่นั่น!


0

คุณอาจระบุ.phpนามสกุลและไม่พบชั้นเรียนของคุณ

สิ่งที่ฉันทำ:

php artisan db:seed --class=RolesPermissionsTableSeeder.php

ฉันแก้ปัญหาอะไรได้บ้าง: ฉันกำลังทำอะไรอยู่:

php artisan db:seed --class=RolesPermissionsTableSeeder

-5

ฉันมีข้อผิดพลาด "ข้อยกเว้นการสะท้อน" เดียวกัน ทางออกคือการคัดลอกไฟล์คลาสไปยังเซิร์ฟเวอร์จาก dev สำหรับฉัน ผิดพลาดโง่ แต่ให้จำนวนไฟล์ที่เราจัดการกับมันง่ายที่จะลืมที่จะคัดลอกไปยังเซิร์ฟเวอร์ทุกครั้ง


2
การตอบสนองนี้ค่อนข้างคลุมเครือและควบคู่ไปกับการติดตั้งโฮสต์ของคุณ แม้ว่าการป้อนข้อมูลของคุณจะมีค่า แต่อาจไม่ช่วยให้นักพัฒนาค้นหาวิธีแก้ไขปัญหานี้ ฉันคิดว่าปัญหาของคุณเกิดจากการที่คุณทิ้งมนุษย์ไว้เพื่อคัดลอกไฟล์ไปยังเซิร์ฟเวอร์ ขอแนะนำให้มี CI ไปป์ไลน์ที่มีการปรับใช้ไฟล์ไปยังเซิร์ฟเวอร์โดยอัตโนมัติ :)
38411
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.