Пользовательский класс не загружается в контроллер - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть файл с именем 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: "->"},…]

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 09 декабря 2018

Ошибка вызвана тем, что ваш код не использует правильный класс, это то, что он ищет:

App\Http\Controllers\InvoiceDataSource

Что бы просто искать файл InvoiceDataSource.php в папке вашего контроллера.

Чтобы изменить класс, он ищет использование use.

Это потому, что, поскольку вы находитесь в пространстве имен контроллера, когда вы называете класс без атрибута use, по умолчанию используется пространство имен контроллера (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();

  }

// ...

}

ОБНОВЛЕНИЕ:

Как уже упоминалось в комментариях, у вас есть и другие альтернативы, когда вы включаете класс с другим пространством имен:

1) Используйте все пространство имен класса

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

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

  }

2) Или, если у вас есть несколько классов с одинаковыми именами в разных пространствах имен, вы можете использовать их как:

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