PHP Laravel - 类[控制器名称]控制器不存在。

3

我目前正在尝试开发一个自定义的Laravel包,但是在开始时遇到了一些问题。

这是我的文件结构:

-packages
  - oliverbusk
   -invoiceconverter
    -src
      -controllers 
         - InvoiceconverterController.php
      -resources
         - views
           - home.blade.php
      -routes
         - web.php
    - InvoiceConverterServiceProvider.php

正如您所看到的,我的文件位于src/文件夹中。

首先,这是我的composer.json在我的包文件夹内:

"extra": {
        "laravel": {
            "providers": [
                "Oliverbusk\\Invoiceconverter\\InvoiceConverterServiceProvider"
            ]
        }
    }

我已经在我的项目的 主要 composer.json 文件中自动加载了它:

"require": {
  //....
  "oliverbusk/invoiceconverter": "dev-feature-package"
},
"autoload": {
        [...]
        "psr-4": {
            "App\\": "app/",
            "Oliverbusk\\Invoiceconverter\\": "packages/oliverbusk/invoiceconverter"
        }
},

这是我的服务提供者文件:
namespace Oliverbusk\Invoiceconverter;

use Illuminate\Support\ServiceProvider;

class InvoiceConverterServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //Load our routes
        $this->loadRoutesFrom(__DIR__ . '/routes/web.php');

        //Load our views
        $this->loadViewsFrom(__DIR__ . '/resources/views', 'invoiceconverter');
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
      //
    }
}

我的控制器文件位于controllers/目录下:

namespace Oliverbusk\Invoiceconverter\Controllers;

use App\Http\Controllers\Controller;

class InvoiceconverterController extends Controller
{
    public function index()
    {
        return view('invoiceconverter::home');
    }
}

最后,我的routes/web.php文件:
Route::group(['namespace' => 'Oliverbusk\InvoiceConverter\Controllers'], function () {
    Route::get('invoiceconverter', 'InvoiceconverterController@index');
});

错误:

Oliverbusk\InvoiceConverter\Controllers\InvoiceconverterController类不存在

额外信息:

Composer dump autoload 显示如下:

Discovered Package: oliverbusk/invoiceconverter
  • 我已经尝试使用php artisan:cache:clear清除缓存。
  • 我也尝试了composer update

我不确定这是否会有影响,但你应该确保你的 controllers 目录首字母大写以匹配命名空间,所以它应该是 Controllers。虽然可能只是这样而已。类名和文件名也应保持相同的大小写形式。 - Jonathon
@urfusion - 这个包目前还没有发布任何内容。 - oliverbj
@Jonathon - 我刚试着将文件夹名称更改为“Controllers”- 没有起作用。 - oliverbj
你试过将类名改成与文件名匹配,或者将文件名改成与类名匹配吗? - Jonathon
@JamesCook - 很好的捕捉。只有 InvoiceconverterController.php 被更新。 - oliverbj
显示剩余4条评论
1个回答

1

您路由中的命名空间与实际使用的命名空间不匹配。

Route::group(['namespace' => 'Oliverbusk\InvoiceConverter\Controllers'], function () {
    Route::get('invoiceconverter', 'InvoiceconverterController@index');
});

改变为
Route::group(['namespace' => 'Oliverbusk\Invoiceconverter\Controllers'], function () 
{
    Route::get('invoiceconverter', 'InvoiceconverterController@index');
});

看看这是否有帮助。

我还建议您重构所有代码,将其大写为InvoiceConverter,因为它们是两个单独的单词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接