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 Класс модели не найден)
Ответы
Ответ 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; });