Предупреждение PHP: include(C:\xampp\htdocs\hse\vendor\composer/../../app/Buildings.php): не удалось открыть поток

Ранее я вручную удалил некоторые файлы моделей в приложении * и создал другие, просто удалив символ «s», потому что laravel по умолчанию может распознавать модели по имени, а модели по стандарту Laravel должны быть написаны нормально, а не во множественном числе.

Перед удалением моделей, которые я создал с помощью php artisan make:model Buildings -m

Новая модель, которую я создал после того, как удалил модель (зданий), — это php artisan make:model Building. Обратите внимание, что я только что создал новую модель без «s».

Теперь в моей модели пользователя я создал метод:

public function UserAssignedBuilding(){
        return $this->hasManyThrough('App\Building','App\Area','user_id','area_id');
    }

Файл модели Building.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Building extends Model
{
    protected $table = 'buildings';

    public function areas(){
        $this->belongsTo('App\Area');
    }

}

Файл модели Area.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Area extends Model
{
    protected $fillable = [
        'name'
    ];

    public function users(){
        return $this->belongsToMany('App\User','area_user','area_id','user_id');
    }

    public function buildings(){
        return $this->hasMany('App\Building');
    }
}

В php artisan, когда я запускаю следующую команду, чтобы получить назначенные пользователем здания:

>>> User::find(4)->UserAssignedBuilding
PHP warning:  include(C:\xampp\htdocs\hse\vendor\composer/../../app/Buildings.php): failed to open stream: No such file or directory in C:\xampp\htdocs\hse\vendor\composer\ClassLoader.php on line 444

Похоже, что ошибка заключается в том, что фреймворк пытается загрузить файл модели (Buildings.php), который я уже удалил и вместо этого создал (Building.php).

Я запускаю следующее:

C:\xampp\htdocs\hse>composer dumpautoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Package manifest generated successfully.

Но проблема не исправлена

Также пытался получить строки зданий, другая ошибка показывает: -

>>> Building::all()
PHP Fatal error:  Class 'Building' not found in eval()'d code on line 1

person Q8root    schedule 20.10.2017    source источник


Ответы (3)


В вашей команде отсутствует пространство имен модели

Должен быть

App\User::find(4)->UserAssignedBuilding

И

App\Building::all()

Также измените метод UserAssignedBuilding на buildings

person ljubadr    schedule 20.10.2017
comment
››› App\User::find(4)-›UserAssignedBuilding Предупреждение PHP: include(C:\xampp\htdocs\hse\vendor\composer/../../app/Buildings.php): не удалось открыть поток : Нет такого файла или каталога в C:\xampp\htdocs\hse\vendor\composer\ClassLoader.php в строке 444 ››› И вторая команда: App\Building::all() успешно извлекает все записи таблицы зданий. Но почему, когда я использую ту же команду без указания пространства имен модели для (User::all() и некоторых других таблиц), я успешно получаю запись - person Q8root; 20.10.2017
comment
Попробуйте переименовать UserAssignedBuilding в buildings и использовать так App\User::find(4)->buildings - person ljubadr; 20.10.2017
comment
Это сработало, после того как я разместил этот вопрос, я изменил имя метода на UserBuildings(), поэтому, когда я упомянул в своем предыдущем комментарии, что команда по-прежнему дает ту же ошибку, я набрал старое имя метода App\User::find(4 )->UserAssignedBuilding Но мой вопрос: почему некоторые модели могут быть вызваны в тинкере без ввода пространства имен - person Q8root; 20.10.2017
comment
Не совсем уверен, почему это работает для некоторых... возможно, посмотрите здесь для получения дополнительной информации - person ljubadr; 20.10.2017
comment
Если мой ответ помог, пожалуйста, примите его. Для почему некоторые модели могут быть вызваны в tinker без ввода их пространства имен? возможно, создайте новый вопрос - person ljubadr; 20.10.2017
comment
Показывает ту же ошибку, даже если я набираю полное пространство имен: ››› App\User::find(5)-›role Предупреждение PHP: include(C:\xampp\htdocs\hse\vendor\composer/../../ app/Roles.php): не удалось открыть поток: нет такого файла или каталога в C:\xampp\htdocs\hse\vendor\composer\ClassLoader.php в строке 444. Roles.php - это старый файл модели, который я удалил это раньше - person Q8root; 21.10.2017
comment
у вас настроены отношения? вместо ->role попробуйте ->roles - person ljubadr; 21.10.2017
comment
Да, я на 100% уверен, что отношения наладились идеально. Ошибка показывает, что загрузчик класса композитора пытается загрузить несуществующую старую модель /app/Roles.‌​php (Roles.php) ... эта модель устарела, и я удалил ее и вместо этого создал (Role.php) . Однако я создал новый проект laravel только для тестирования и создал две миграции (роли, пользователи), затем создал файлы модели с теми же отношениями, которые я структурировал сейчас, верните мне результат без ошибок: - person Q8root; 21.10.2017

Ошибка отображается в Tinker (php artisan tinker), когда я сбрасываю файл автозагрузки композитора

composer dump-autoload

Затем снова попробовал в tinker, та же ошибка отображается, как будто команда composer dump не сработала, но когда я закрываю текущий tinker и открываю новый (php artisan tinker), теперь все работает отлично.

Итак, краткое решение: когда вы запускаете команду dumpautoload, вам нужно перезапустить тинкер, чтобы увидеть изменения.

person Q8root    schedule 21.10.2017

Я столкнулся с той же проблемой, но в моем случае проблема заключалась в чувствительности к регистру автозагрузки композитора.

Я создал класс user (с маленькой буквой «u»), используя composer artisan make. Итак, он создал для меня файл user.php. После этого я решил, что мне больше нравится User (с большой буквы «U»), поэтому я изменил имя класса, но не содержащий PHP-файл.

Таким образом, проблема заключалась в том, что композитор искал файл User.php вместо user.php. изменение содержащего файла на User.php помогло мне.

person Gp17    schedule 12.02.2019