2015-02-05 6 views
18

Когда начинает работать с моделями, я получил следующее сообщение об ошибкеLaravel - модель класса не найден

Class Сообщение не found`.

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

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

маршрутизатор. 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';  
} 

То, что я пытался
- Переименование класса
- отвал-автозагрузку (Laravel 4 Model class not found)

ответ

54

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

+1

Ой ничего себе, это сработало. Большое спасибо. Другой вопрос: я хочу создать 5 моделей. User, Post, UserSettings, PostVote, PostComment. Должен ли я помещать их в пространство имен приложений? – Sylnois

+0

Конечно! Фактически, вы можете разместить их под любым пространством имен, которое имеет для вас смысл - ограничений не существует. Однако важно, чтобы все модели находились под тем же * пространством имен. (На самом деле они НЕ ДОЛЖНЫ быть, но это облегчает, если вы только начинаете с них) –

+0

И нет никакой возможности использовать shorted 'Post :: all();' вместо '\ App \ Post: : all() 'все время? – Sylnois

0

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

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

0

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

  1. В изменения файла vendor/composer/autoload_classmap.php линия App\\User' => $baseDir . '/app/User.php',, к App\\Models\\User' => $baseDir . '/app/Models/User.php',

  2. В начало файла app/Services/Registrar.php изменить «использовать приложение \ Пользователь» на «Приложение \ Модели \ Пользователь»

+0

Это очень конкретный ответ (работает только для пользователей по умолчанию, а не для общих классов). Кроме того, изменение файлов поставщиков - очень плохая идея, так как ваши изменения будут нарушены при обновлении фреймворка. – milo526

37

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

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

+1

Хорошо, что сработало. Пожелайте ей понять, почему. – alloyking

+5

Да, я тоже. У кого-нибудь есть понимание? – jlbang

+2

Это работа, спасибо. – Zaman

2

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

Я создал модель, используя команду:

php artisan make:model myModel 

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

namespace App\ModelFolder; 

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

php artisan make:model ModelFolder\\myModel 
Смежные вопросы