0

I'm trying to implement a clean architecture in laravel, thus I'm moving my own code to a src folder.

My controller is located in src\notebook\infrastructure but when i call it from routes\web.php this way:

Route::get('/notebook', 'src\notebook\infrastructure\NotebooksController@show');

i got this error:

Illuminate\Contracts\Container\BindingResolutionException
Target class [src\notebook\infrastructure\NotebooksController] does not exist.
http://127.0.0.1:8000/notebook

i also changed the namespace value in the class RouteServiceProvider from:

protected $namespace = 'App\Http\Controllers';

to

protected $namespace = '';

This is my notebook controller class:

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';
    }
}

My laravel and php version in composer.json are:

"php": "^7.2.5",
"laravel/framework": "^7.24",

I feel like i'm missing something stupid but can't figure it out what.

Yeyez
  • 17
  • 3

1 Answers1

3

Did you add src folder into the autoload? In composer.json file, you must have something like this:

"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Src\\": "src/" // add this
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },

After changing it run composer dump-autoload. And also don't forget to follow psr-4 rules and use Studly case namespace and class names.

namespace Src\Notebook\Infrastructure;
Parsa_Gholipour
  • 459
  • 3
  • 7