Laravel 5 - hạt giống nghệ nhân [ReflectionException] Lớp Bài hátTableSeeder không tồn tại


274

Khi tôi chạy php artisan db: seed, tôi gặp lỗi sau:

[ReflectionException] Class SongsTableSeeder does not exist

Chuyện gì đang xảy ra vậy?

Lớp DatabaseSeeder của tôi :

<?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');
    }

}

Lớp SongsTableSeeder của tôi :

<?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);

    }

}

107
composer dump-autoload?
Thomas Jensen

Tôi nghĩ sử dụng Faker \ Factory là Faker; đang làm việc à
Sasha

Đường dẫn đến tệp chứa SongsTableSeederđịnh nghĩa lớp là gì?
Wouter J


Đây là bãi rác và tồi tệ
Luigi Lopez

Câu trả lời:


746

Bạn cần đặt SongsTableSeedervào tệp SongsTableSeeder.phptrong cùng thư mục nơi bạn có DatabaseSeeder.phptệp của mình .

Và bạn cần phải chạy trong bảng điều khiển của bạn:

composer dump-autoload

để tạo bản đồ lớp mới và sau đó chạy:

php artisan db:seed

Tôi vừa mới thử nó. Nó đang hoạt động mà không có vấn đề gì trong Laravel 5


1
Tôi đã không 'sử dụng mô hình trong lớp seeder của mình. Hoạt động tốt bây giờ.
Jamie Poole

1
composer dumpautoloadcũng bay
Connor Leech

nhà soạn nhạc dump-autoload đã giải quyết vấn đề cho tôi. những gì nhà soạn nhạc dump-autoload thực sự làm gì?
Luís Almeida

5
@ LuísAlmeida dump-autoloadtạo lại danh sách tất cả các lớp cần được đưa vào dự án, nó được sử dụng khi bạn có một lớp mới trong dự án của bạn. Thông thường, việc chạy make:*sẽ thêm lớp vừa tạo, nhưng điều này sẽ không xảy ra nếu bạn tự tạo một seeder. Ít nhất đó là cách tôi hiểu nó hoạt động sau 5 phút tìm kiếm. Tôi không phải là một chuyên gia.
Xander Luciano

Tôi đã thử giải pháp này với Laravel 5.8 trên một máy chủ phát triển và composer dump-autoloadlàm việc cho tôi.
Mycodingproject

19

Tôi đã giải quyết nó bằng cách làm điều này:

  1. Sao chép nội dung tập tin.
  2. Xóa tệp.
  3. Chạy lệnh: php artisan make: seeder.
  4. Sao chép nội dung tập tin trở lại trong tập tin này.

Điều này xảy ra bởi vì tôi đã thay đổi tên tệp. Tôi không biết tại sao nó không hoạt động sau khi thay đổi.


2
Có lẽ chạy trình soạn thảo dump-auto đã dễ dàng hơn. Trình tải tự động hiện đang tìm kiếm một tệp cũ hơn. Vì vậy, nếu bạn kết xuất tệp này qua dòng lệnh, nó sẽ tạo một tệp tự động tải mới với tệp mới. Vì vậy, trong tương lai hãy thử điều này =)
Ron van Asseldonk

Để biết thêm thông tin về trình tải tự động của nhà soạn nhạc, hãy xem trang web này: getcomposer.org/doc/01-basic-usage.md#autoloading
Ron van Asseldonk

van Asseldok, tốt, composer dump-autoloadkhông làm việc cho tôi. Tôi phải tạo lại lớp seeder để làm cho nó hoạt động.
М.erl.

Điều này đã giúp tôi. 'Trình soạn thảo kết xuất tự động tải' cũng không hoạt động đối với tôi, một số việc phải làm với cài đặt máy chủ của tôi hoặc thực tế đó là một máy chủ chung.
Derk Jan Speelman

16

Tệp SongsTableSeeder.php phải nằm trong thư mục cơ sở dữ liệu / hạt giống hoặc trong thư mục con của nó.

Bạn cần chạy:

composer dump-autoload

và sau đó:

php artisan db:seed

hoặc là:

php artisan db:seed --class=SongsTableSeeder

1
có thể thấy lỗi Parse với lệnh 'php artisan db: seed - class = SongsTableSeeder'. thnks !!
OmiK

4

SongsTableSeeder.php phải có trong thư mục cơ sở dữ liệu / hạt giống

Các bước lệnh Console:

composer dump-autoload

và sau đó:

php artisan cache:clear

và sau đó:

php artisan optimize

và sau đó:

php artisan db:seed

hoặc là:

php artisan db:seed --class=SongsTableSeeder

Đã làm cho tôi! Đặc biệt là php artisan optimizephần
Moses Ndeda

3

Tôi đang chạy bản phát hành Laravel 5 dev mới nhất và nếu bạn đã thay đổi không gian tên, bạn sẽ cần gọi lớp hạt giống của mình như sau:

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

Rõ ràng bạn sẽ cần phải thay thế todoparrotbằng không gian tên được chỉ định của bạn. Nếu không, tôi nhận được cùng một lỗi được chỉ ra trong câu hỏi ban đầu.


3

Đừng quên rằng các composer dump-autoloadcông việc liên quan đến phần autoload / classmap của composer.json. Hãy cẩn thận về điều đó nếu bạn cần thay đổi thư mục seeders hoặc sử dụng nhiều thư mục để lưu trữ seeders.

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

0

Nếu CustomTableSeeder của chúng ta nằm trong cùng thư mục với DatabaseSeeder, chúng ta nên sử dụng như dưới đây:

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

trong tập tin cơ sở dữ liệu của chúng tôi; sau đó, một lỗi khác sẽ được đưa ra: 'Không tìm thấy lớp DB', sau đó chúng ta nên thêm mặt tiền DB của mình vào Tệp CustomTableSeeder như bên dưới:

use Illuminate\Support\Facades\DB;

nó làm việc cho tôi


0

Tôi đã chỉ sử dụng SINGLE FILE với HAI lớp trong đó:

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

Nếu bạn đã sao chép các tập tin seeders từ bất kỳ dự án nào khác thì bạn cần chạy lệnh artisan php artisan db:seednếu không nó vẫn ổn.


0

Tôi [ReflectionException] Class Seeder does not existcũng vậy và khi tôi sử dụng composer dump-autoload, tôi đã gặp một lỗipreg_match(): JIT compilation failed: no more memory khi chạy nó.

Những gì tôi đã làm là tôi thay đổi ;pcre.jit=1thành pcre.jit=Offtrong php.ini ! Bạn có thể tìm thấy đường dẫn bằng cách sử dụngphp --ini trong thiết bị đầu cuối của bạn!

Tôi đang sử dụng mac với php 7.3! Hy vọng rằng sẽ giúp bất cứ ai trong số các bạn ngoài kia!


0

Bạn có thể chỉ định .php phần mở rộng và Nó không tìm thấy lớp của bạn.

Những gì tôi đang làm :

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

Điều gì đã giải quyết vấn đề của tôi: Những gì tôi đã làm:

php artisan db:seed --class=RolesPermissionsTableSeeder

-5

Tôi đã có cùng một lỗi "ngoại lệ phản chiếu". Giải pháp là sao chép tập tin lớp vào máy chủ, từ dev, cho tôi. sai lầm ngớ ngẩn, nhưng cho biết có bao nhiêu tệp chúng ta xử lý dễ dàng để quên sao chép chúng vào máy chủ mỗi lần.


2
Phản hồi này rất mơ hồ và được kết hợp với thiết lập lưu trữ cụ thể của bạn. Mặc dù đầu vào của bạn có giá trị nhưng điều này có thể không giúp các nhà phát triển tìm kiếm giải pháp cho vấn đề này. Tôi nghĩ vấn đề của bạn là do bạn để nó xuống cho con người để sao chép các tập tin vào máy chủ. Chúng tôi khuyến khích có một đường ống CI nơi các tệp được tự động triển khai đến máy chủ :)
charj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.