【问题标题】:How to deal with Class not found with composer如何处理作曲家找不到的类
【发布时间】:2017-09-19 13:59:43
【问题描述】:

我安装了 composer 和 laravel 并安装了一些包
一切正常,但现在我在服务文件夹下创建了自己的类
我给了它这样的服务名称空间:

命名空间服务;

类名是UploadToImgurService

我运行 composer 命令:

 composer dump-autoload

我在控制器中写道:

 use Services\UploadToImgurService;

但我收到此错误:

 Class 'Services\UploadToImgurService' not found

我做错了什么? 为了自动加载服务类,我还应该对 composer 做些什么吗?

编辑 我找到了解决方案
我编辑了 y composer.json 文件并添加到 psr-4 行

     "Services\\" : "app/services"

但为什么它以前没有工作?行:

 "App\\": "app/",

在那里,也许它加载了类但在应用程序命名空间下?

【问题讨论】:

  • 您的解决方案(在 psr-4 中添加服务)解决了我的问题。谢谢!

标签: php composer-php


【解决方案1】:

如果您使用的是区分大小写的文件系统,则需要将Services 文件夹与大写S

【讨论】:

    【解决方案2】:

    你的想法是对的,但让我试着解释一下 psr-4 自动加载的工作原理。

    您可以在 composer.json 文件中定义根命名空间并将其映射到任何项目目录。在定义的目录中,您的类应该获得根命名空间。根之后的命名空间段由你的子目录结构构建,类名等于文件名(PSR-4 Autoloading)。

    例如 "MyNamespace\\WithSubNamespace\\": "cool/project"

    cool/project/MyClass.php -> MyNamespace\WithSubNamespace\MyClass

    cool/project/SubDirectory/AnotherClass.php -> MyNamespace\WithSubNamespace\SubDirectory\AnotherClass

    在 Laravel 中,app 目录默认映射到 App 命名空间。或者,您可以使用命令php artisan app:name [NewRootNamespaceName] 更改根命名空间,但自动加载器仅在应用程序目录中查找类。 如果您在“app”之外创建新目录,则必须将该目录添加到 composer.json 文件中的 psr-4 命名空间映射中。

    在您的示例中,您在现有应用程序目录中定义了一个新的根命名空间,因此您的问题是根命名空间是未知的,您通过在 composer.json 中添加该行来解决它。 这是可能的,因为 psr-4 提供了巨大的灵活性。但就个人而言,我不建议在同一个项目中使用不同的根命名空间。

    我希望我能提供帮助,也许这对你来说也很有趣:composer.json PSR-4

    【讨论】:

      【解决方案3】:

      也许你忘了添加这行代码

      require_once('vendor/autoload.php');
      

      【讨论】:

      • 这个答案实际上解决了我的问题。作曲新手来了! :)
      猜你喜欢
      • 1970-01-01
      • 2018-04-05
      • 2016-01-17
      • 2015-01-30
      • 2017-12-01
      • 1970-01-01
      • 2017-02-06
      • 2015-07-04
      • 2016-01-22
      相关资源
      最近更新 更多