问题描述
我正在尝试在 laravel 中实现一个干净的架构,因此我将自己的代码移动到 src
文件夹中。
我的控制器位于 src\notebook\infrastructure
但当我从 routes\web.PHP
调用它时:
Route::get('/notebook','src\notebook\infrastructure\NotebooksController@show');
我收到此错误:
Illuminate\Contracts\Container\BindingResolutionException
Target class [src\notebook\infrastructure\NotebooksController] does not exist.
http://127.0.0.1:8000/notebook
我还更改了类 RouteServiceProvider
中的命名空间值:
protected $namespace = 'App\Http\Controllers';
到
protected $namespace = '';
这是我的笔记本控制器类:
namespace src\notebook\infrastructure;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class NotebooksController extends Controller
{
public function show($id)
{
echo 'controller from infrastructure folder';
}
}
我在 composer.json
中的 laravel 和 PHP 版本是:
"PHP": "^7.2.5","laravel/framework": "^7.24",
我觉得我错过了一些愚蠢的东西,但不知道是什么。
解决方法
您是否将 src 文件夹添加到自动加载中? 在 composer.json 文件中,你必须有这样的东西:
"autoload": {
"psr-4": {
"App\\": "app/","Src\\": "src/" // add this
},"classmap": [
"database/seeds","database/factories"
]
},
更改后运行 composer dump-autoload
。
并且不要忘记遵循 psr-4 规则并使用 Studly 大小写命名空间和类名。
namespace Src\Notebook\Infrastructure;