PSR-4命名空间使用失败问题求助
先给你揪出最可能的核心问题——你踩了PSR-4最常见的坑:文件名和类名不匹配!
核心问题:违反PSR-4命名规范
你这两个类的文件名完全不符合PSR-4的要求:
/myapp/backoffice/src/Services/Abstract.php里的类是AbstractService,文件名必须改成AbstractService.php/myapp/backoffice/src/Services/Login.php里的类是LoginService,文件名必须改成LoginService.php
PSR-4的核心规则就是:类的文件名必须和类名完全一致(包括大小写)。自动加载器会根据类名拼接出要找的文件路径,比如Myapp\Backoffice\Services\LoginService会被解析成../backoffice/src/Services/LoginService.php,但你的文件是Login.php,自动加载器根本找不到这个文件,自然就报类不存在的错误了。
修正后的必要操作
把文件名改对之后,一定要更新composer的自动加载缓存:
- 进入
/myapp/backoffice/目录,运行:composer dump-autoload - 进入
/myapp/rest/目录,同样运行:composer dump-autoload
其他可能的排查要点
如果改了文件名还是不行,再检查下面这些点:
1. 确认入口文件加载了正确的autoload.php
你的REST应用入口(比如public/index.php)必须引入/myapp/rest/vendor/autoload.php,不能引入backoffice目录下的autoload。要是加载错了,rest里配置的Myapp\Backoffice映射根本不会生效。
2. 检查大小写敏感性(针对Linux/macOS服务器)
Linux和macOS是区分文件名大小写的,比如LoginService.php不能写成loginservice.php或者Login.php,系统会把它们当成完全不同的文件。
3. 验证路径映射是否正确
可以在rest项目里加一段测试代码,看看自动加载器的路径映射对不对:
<?php require '/myapp/rest/vendor/autoload.php'; $loader = require '/myapp/rest/vendor/autoload.php'; var_dump($loader->getPrefixesPsr4()['Myapp\\Backoffice\\']);
运行这段代码,应该输出指向/myapp/backoffice/src/的路径,要是路径不对,就得检查rest的composer配置里的../backoffice/src/是不是写错了。
4. 检查文件权限
确保Web服务器进程(比如www-data、nginx用户)能读取/myapp/backoffice/src/目录下的所有文件和子目录,权限不足也会导致类加载失败。
内容的提问来源于stack exchange,提问作者altralaser

