Laravel 5.5报错:Class App\Repositories\TodoInterface不存在,求排查
兄弟,我之前在Laravel 5.x里折腾仓库模式时也碰到过一模一样的报错,给你梳理几个最可能的排查点,一步步来应该就能解决:
严格检查文件名与类名的大小写匹配
Laravel遵循PSR-4自动加载规范,文件名必须和类名完全一致(包括大小写)。比如你的接口文件是TodoInterface.php,那文件里的类名必须是TodoInterface,不能写成todoInterface或者Todointerface,哪怕一个字母大小写错了都会导致找不到类。确认命名空间与文件夹结构对应
你的文件夹是app/Repositories,代码里的命名空间namespace App\Repositories;是正确的,但要确保两个文件里的命名空间都没写错,比如EloquentTodo.php里的命名空间也得是App\Repositories,不能少写或者多写层级。重新生成自动加载文件
当你新增了自定义类文件后,Laravel的自动加载器可能还没识别到,打开终端运行这个命令:composer dump-autoload这个命令会重新生成
vendor/autoload.php文件,让框架能找到你的新类。检查服务提供者的绑定是否正确
你应该在某个ServiceProvider里(比如AppServiceProvider)做了接口与实现类的绑定,一定要确保类的路径完全正确:// AppServiceProvider.php 的 register 方法里 use App\Repositories\TodoInterface; use App\Repositories\EloquentTodo; public function register() { $this->app->bind(TodoInterface::class, EloquentTodo::class); }如果绑定的时候类名写错了(比如少了命名空间,或者拼写错误),就会触发找不到类的异常。
控制器里的依赖注入是否正确引入
在使用仓库的控制器里,要正确引入接口的命名空间:use App\Repositories\TodoInterface; class TodoController extends Controller { protected $todoRepo; public function __construct(TodoInterface $todoRepo) { $this->todoRepo = $todoRepo; } // 比如调用 getAll 方法 public function index() { $todos = $this->todoRepo->getAll(); return view('todos.index', compact('todos')); } }如果没写
use App\Repositories\TodoInterface;,直接在构造函数里写TodoInterface $todoRepo,框架会在当前命名空间(比如App\Http\Controllers)下找这个类,自然找不到。
按这几步排查下来,应该就能定位到问题啦!
内容的提问来源于stack exchange,提问作者MH9

