Laravel 5.8中出现未捕获的错误“找不到类”

时间:2019-06-09 18:52:43

标签: php laravel oop composer-php

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

我收到此错误:

  

未捕获的错误:在/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();

2 个答案:

答案 0 :(得分:2)

您不能使用以数字开头的命名空间。

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

  

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

(强调我的)。

因此,您的声明

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),由于根本不会运行自动加载逻辑,这将根本不起作用。

如果您是手动执行脚本,则在上述更改的基础上,您需要包括位于vendor/autoload.php上的composer autoload脚本。

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

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

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

安装好后,将运行自动加载器,并找到类。

答案 1 :(得分:-2)

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

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

PHP manual comment

  

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

     

namespace Mynamespace \ 1; //非法

     

请改为使用此:名称空间

     

Mynamespace \ v1; //好