Подтвердить что ты не робот

Laravel - модельный класс не найден

При запуске работы с моделями я получил следующую ошибку

Класс Post не найден.

Все, что я сделал:
- Создал модель с помощью команды php artisan make:model
- Пытался получить все записи из таблицы posts с помощью echo Post::all()

Я использовал следующий код:

router.php

Route::get('/posts', function(){
    $results = Post::all();
    return $results;
});

Post.php

<?php 
namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model {
    protected $table = 'posts';    
}

Что я пробовал - Переименование класса
- Dump-autoload (Laravel 4 Класс модели не найден)

4b9b3361

Ответ 1

Laravel 5 способствует использованию namespaces для таких вещей, как модели и контроллеры. Ваша модель находится под пространством имен App, поэтому ваш код должен называть его следующим образом:

Route::get('/posts', function(){

        $results = \App\Post::all();
        return $results;
});

Как указано в комментариях, вы также можете use или импортировать пространство имен в файл, поэтому вам не нужно указывать полный путь, например:

use App\Post;

Route::get('/posts', function(){

        $results = Post::all();
        return $results;
});

Пока я делаю короткое праймер на пространствах имен, я мог бы также упомянуть о способности псевдонимов класса. Это означает, что вы можете по существу переименовать свой класс только в области одного файла, например:

use App\Post as PostModel;

Route::get('/posts', function(){

        $results = PostModel::all();
        return $results;
});

Подробнее о импорте и псевдониме имен здесь: http://php.net/manual/en/language.namespaces.importing.php

Ответ 2

У меня было такое же сообщение "Class [class name] not found", но это не было проблемой пространства имен. Все мои пространства имен были настроены правильно. Я даже пробовал composer dump-autoload, и это мне не помогло.

Удивительно (для меня) я тогда сделал composer dump-autoload -o, который, согласно помощи Composer, "оптимизирует пакеты PSR0 и PSR4, которые тоже будут загружены с помощью classmaps, хороших для производства". Как-то так получается, что композитор должен вести себя правильно и включить класс в файл autoload_classmap.php.

Ответ 3

У меня была такая же ошибка в Laravel 5.2, оказалось, что пространство имен неверно в определении класса модели.

Я создал свою модель с помощью команды:

php artisan make:model myModel

По умолчанию Laravel 5 создает модель в папке App, но если вы хотите переместить модель в другую папку, как я, вы также должны изменить пространство имен внутри определения модели:

namespace App\ModelFolder;

Чтобы включить имя папки при создании модели, которую вы можете использовать (не забудьте использовать двойные косые черты):

php artisan make:model ModelFolder\\myModel

Ответ 4

Как сказал @bulk, он использует пространства имен.

Я рекомендую вам начать использовать IDE, он предложит вам импортировать все необходимые пространства имен (\App\Post в этом случае).

Ответ 5

Если после изменения пространства имен и config/auth.php он все равно не работает, вы можете попробовать следующее:

  • В файле vendor/composer/autoload_classmap.php изменить линию App\\User' => $baseDir . '/app/User.php', в App\\Models\\User' => $baseDir . '/app/Models/User.php',

  • В начале файла app/Services/Registrar.php измените "использовать App\User" в "App\Models\User"

Ответ 6

Будьте внимательны при редактировании файла модели. Например, в вашем посте модель:

<?php 
namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model {
    protected $table = 'posts';    
}

Вам необходимо обратить пристальное внимание на class Post extend Model line. Класс Post определенный здесь, будет вашим пространством имен для вашего контроллера.

Ответ 7

В вашем файле router.php вы должны использовать класс модели следующим образом

 use App\Post;

и используйте класс модели, как это.

Route::get('/posts', function() {

        $results = Post::all();
        return $results; });