1

I'm developing an e-commerce website using Laravel 8, And I tried to change on Laravel folders structure I've put views folder inside new path modules/admins which works fine, and I've also created a Models folder in the modules/admins path which works fine, however, I am having trouble with the controllers folder.

I still have the app/http/controllers/Controller.php, but now I've created a folder called Controllers inside the modules folder, and in it I have a controller called AdminController

error message: "Target class [Modules\Admins\Controllers\AdminController] does not exist."

project structure enter image description here

AdminController file


namespace Modules\Admins\Controllers;

use App\Http\Controllers\BaseController;
use App\Http\Traits\ApiDesignTrait;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\{
    Hash, Validator
};
class AdminController extends BaseController
{
    public function test()
    {
        return true;
    }
}

route.php

use Illuminate\Support\Facades\Route;
use Modules\Admins\Controllers\AdminController;

Route::post('/test',  [AdminController::class, 'test']);

BaseController.php


namespace App\Http\Controllers;

use App\Http\Controllers\Controller;


class BaseController extends Controller
{

}

Controller.php


namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

2 Answers2

0

Because your defined namespace is outside of app, you should autoload it in your composer.json file.

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/",
        "Modules\\": "Modules/"
    }
},

Then run composer dump-autoload and it should work fine.

Mohsen Nazari
  • 1,281
  • 1
  • 3
  • 13
0

You need to change the namespace of the route file in the route service provider class in app/Providers/RouteServiceProvider.php you need to edit the boot function

/**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('web')
                ->namespace('Modules\\Admins\\Controllers')
                ->group(base_path('routes/route.php'));
        });
    }

in your route.php you can do this

Route::post('/test',  'AdminController@test');

if you dont want to edit the service provider

Route::namespace('Modules\\Admins\\Controllers')->group(function () {
    Route::post('/test', 'AdminController@test');
});
N69S
  • 16,110
  • 3
  • 22
  • 36