【问题标题】:PHP warning: include(C:\xampp\htdocs\hse\vendor\composer/../../app/Buildings.php): failed to open streamPHP 警告:包括(C:\xampp\htdocs\hse\vendor\composer/../../app/Buildings.php):无法打开流
【发布时间】:2019-04-04 15:22:09
【问题描述】:

我之前手动删除了 App* 中的一些模型文件,并通过删除“s”符号创建了其他文件,因为 laravel 默认可以从名称中识别模型,并且 Laravel 标准的模型必须写正常而不是复数。

在删除我创建它们使用的模型之前 php artisan make:model Buildings -m

我删除(建筑物)模型后创建的新模型是 php artisan make:模型构建 请注意,我刚刚创建了一个没有 '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

【问题讨论】:

    标签: php mysql laravel eloquent laravel-eloquent


    【解决方案1】:

    Tinker (php artisan tinker) 中显示错误, 当我转储作曲家自动加载文件时

    composer dump-autoload
    

    然后在 tinker 中再次尝试,显示相同的错误,就像 composer dump 命令没有执行它一样,但是当我关闭当前的 tinker 并打开新的 (php artisan tinker) 时,现在一切正常。

    所以,简单来说,解决方案是当你运行 dumpautoload 命令时,你需要重启 tinker 才能看到变化。

    【讨论】:

      【解决方案2】:

      在您的命令中,您缺少模型命名空间

      应该是

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

      App\Building::all()
      

      还将方法UserAssignedBuilding更改为buildings

      【讨论】:

      • >>> App\User::find(4)->UserAssignedBuilding PHP 警告:include(C:\xampp\htdocs\hse\vendor\composer/../../app/Buildings .php): 无法打开流: 第 444 行的 C:\xampp\htdocs\hse\vendor\composer\ClassLoader.php 中没有这样的文件或目录 >>> 第二个命令 :App\Building::all() 是成功检索到所有建筑物表记录。但是为什么当我使用相同的命令而不为(User::all() 和其他一些表)指定模型命名空间时,我成功获得了一条记录
      • 尝试将UserAssignedBuilding重命名为buildings并像这样使用App\User::find(4)-&gt;buildings
      • 这行得通,在我发布这个问题之后,我将方法名称更改为 UserBuildings() 所以当我在之前的评论中提到该命令仍然给出相同的错误时,我输入了旧的方法名称App\User::find(4)->UserAssignedBuilding 但我的问题是:为什么可以在 tinker 中调用某些模型而无需在其中键入命名空间
      • 不太清楚为什么它适用于某些人......也许看看here for more info
      • 如果我的回答有帮助,请考虑接受。对于为什么有些模型可以在不输入命名空间的情况下在 tinker 中调用? 可以创建一个新问题
      【解决方案3】:

      我遇到了同样的问题,但就我而言,问题是作曲家自动加载的大小写敏感。

      我使用composer artisan make 创建了user 类(带有小“u”)。所以它为我创建了user.php 文件。后来,我决定我更喜欢User(大写'U'),所以我更改了类名,但没有更改包含的PHP文件。

      所以问题是作曲家正在寻找User.php 文件而不是user.php。将包含文件更改为 User.php 为我完成了这项工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 2020-04-16
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 2011-07-16
        相关资源
        最近更新 更多