自定义 Class 未在控制器中加载

Custom Class not loading in Controller

我有一个名为 InvoiceDataSource.php 的文件,它的路径是 app\Core\Forms\Invoice\InvoiceDataSource.php,该文件包含这个。

<?php

namespace App\Core\Forms\Invoice;

class InvoiceDataSource {

public function getAllCustomers(){

    return Customer::selectRaw('id as `value`,'.
                     'name as `label`')
                    ->get()
                    ->toArray();
}

}

?>

我也像这样将其包含在 composer.json 文件中,

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories",
        "app/Core/Forms/Invoice/InvoiceDataSource.php" 
    ],
    "psr-4": {
        "App\": "app/"
    }
},

它也被添加到 autoload_classmap.php 文件中的自动加载器。

现在,当我尝试像这样在控制器中访问它时

//
public function getDataSource($id,Request $request){

    return InvoiceDataSource::getAllCustomers();

}

但是由于某种原因,错误读取了这个,

{message: "Class 'App\Http\Controllers\InvoiceDataSource' not found",…}
exception: "Symfony\Component\Debug\Exception\FatalThrowableError"
file: "/home/zrehan/projects/erp/app/Http/Controllers/FormController.php"
line: 88
message: "Class 'App\Http\Controllers\InvoiceDataSource' not found"
trace: [{function: "getDataSource", class: "App\Http\Controllers\FormController", type: "->"},…]

有人可以帮我解决这个问题吗?

错误被触发是因为你的代码没有使用正确的class,这就是它正在寻找的:

App\Http\Controllers\InvoiceDataSource

这只是在您的控制器文件夹中查找文件 InvoiceDataSource.php

要更改 class 它正在寻找使用 use

这是因为您在控制器命名空间中,当您命名一个没有 use 属性的 class 时,它默认为控制器 (App\Http\Controllers) 命名空间。

<?php

namespace App\Http\Controllers;

// ...

use App\Core\Forms\Invoice\InvoiceDataSource;

// ...

class SomeController expands Controller {
  // ...

  public function getDataSource($id,Request $request){

      return InvoiceDataSource::getAllCustomers();

  }

// ...

}

更新:

如评论中所述,当包含具有不同命名空间的 class 时,您也有不同的选择:

1) 使用整个 class 命名空间

  public function getDataSource($id,Request $request){

      return App\Core\Forms\Invoice\InvoiceDataSource::getAllCustomers();

  }

2) 或者如果你有多个 classes 在不同的命名空间下具有相同的名称你可以使用 as:

use App\Core\Forms\Invoice\InvoiceDataSource as DataSource
use App\Core\Mailer\Invoice\InvoiceDataSource as DataSourceMailer
// ... etc