【问题标题】:Uncaught Error "Class not found" in Laravel 5.8Laravel 5.8 中未捕获的错误“找不到类”
【发布时间】:2021-12-02 01:54:10
【问题描述】:

我正在尝试从另一个文件夹调用我的模型文件。这两种文件结构我都提供了。

我收到此错误:

未捕获的错误:在 /Applications/XAMPP/xamppfiles/htdocs/pro/app/Scr​​ipts/Providers/1/Scrape.php:17 中找不到类“App\Models\Providers”

我正在从位于的脚本文件夹中调用模型文件:

app/Scripts/Providers/1/Scrape.php

在这堂课中,我有以下内容:

namespace App\Scripts\Providers\1;
use App\Models;

模型文件所在位置:

app/Models/Providers.php

在这个文件中,我有以下内容:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

我没有分享我在这两个文件中的全部内容。如果您想查看这些文件的完整内容,请告诉我。

这就是 Scrape.php 的样子

<?php
namespace App\Scripts\Providers\1;
use App\Models\Providers;

class Scrape {
    public function __construct() {
        $test = new \App\Models\Providers();
        die(print_r($test, true));
    }
}

$obj = new Scrape();

【问题讨论】:

    标签: php laravel oop composer-php


    【解决方案1】:

    在您的Scrape.php 中,将您的命名空间更改为:

    <?php
    namespace App\Scripts\Providers\p1;
    

    来自PHP manual comment

    命名空间(即使是嵌套或子命名空间)不能只是一个数字,它 必须以字母开头。例如,假设您想使用 用于包版本控制或 API 版本控制的命名空间:

    命名空间我的命名空间\1; // 非法

    改用这个:命名空间

    我的命名空间\v1; // 好的

    【讨论】:

      【解决方案2】:

      你不能有一个以数字开头的命名空间。

      命名空间遵循相同的basic rules for variable names

      有效的变量名称以字母或下划线开头,后跟任意数量的字母、数字或下划线

      (强调我的)。

      因此,您的声明

      namespace App\Scripts\Providers\1
      

      基本上无效

      从那时起,所有赌注都取消了。

      首先,将您的命名空间更改为有效的标识符(我建议您选择比 数字 更合理、更易于识别的名称,您可以使用描述性名称,而这只是 没有理由 不):

      namespace App\Scripts\Providers\GroupWhatever
      

      从逻辑上讲,您必须重命名此文件所在的文件夹。以前是

      app/Scripts/Providers/1/Scrape.php
      

      所以将该目录重命名为

      app/Scripts/Providers/GroupWhatever/Scrape.php
      

      (在这两种情况下,请将 GroupWhatever 替换为对您的应用程序和域有意义的内容)。

      从那时起,如果 \App\Models\Providers 类存在于 app/Models/Providers.php,它应该可以工作。

      重要:

      可能存在的另一个问题是不太清楚Scripts/Scrape.php 是什么或如何调用它。

      如果你在 Laravel 中通过调用 Laravel 控制器或控制台应用程序来执行 Scrape.php,这应该可以工作。

      如果您直接调用此脚本(例如,通过执行 php app/Scripts/Providers/1/Scrape.php(或更正后的 app/Scripts/Providers/GroupWhatever/Scrape.php),这根本行不通,因为根本不运行自动加载逻辑。

      如果您手动执行脚本,除了上述更改,您还需要包含 composer autoload 脚本,该脚本位于 vendor/autoload.php

      基本上,将此行添加到您的Scrape.php 顶部附近:

      require_once dirname( __DIR__ ) . '/../../../vendor/autoload.php';
      

      (我想我放置了适当数量的 go-up-one-dir 路径段,但请确保它与安装中的正确路径匹配)。

      一旦就位,自动加载器就会运行,并且会找到类。

      【讨论】:

      • 我猜他有自动加载问题,他应该转储自动加载
      • 这不太可能,@Thamer。它们指的是App\Model 命名空间中的一个类,来自App\Scripts 命名空间中的另一个类。如果一个类被自动加载,另一个类也应该被自动加载。我相信更有可能的问题是他们试图直接执行Scrape.php,因此根本不执行自动加载器。
      • @yivi 我做了更改,但仍然是同样的错误
      • 就像你说的我通过执行 php FILEPATH 直接调用脚本
      猜你喜欢
      • 1970-01-01
      • 2018-03-09
      • 2022-07-21
      • 2020-10-02
      • 2020-11-10
      • 2021-12-03
      • 2020-04-21
      相关资源
      最近更新 更多